gpt4 book ai didi

scala - 如何编写返回验证的函数?

转载 作者:行者123 更新时间:2023-12-01 12:34:57 26 4
gpt4 key购买 nike

这是我之前 question 的后续

假设我有两个验证函数,如果输入有效则返回输入,否则返回错误消息。

type Status[A] = ValidationNel[String, A]

val isPositive: Int => Status[Int] =
x => if (x > 0) x.success else s"$x not positive".failureNel

val isEven: Int => Status[Int] =
x => if (x % 2 == 0) x.success else s"$x not even".failureNel

还假设我需要验证 case class X 的实例:

case class X(x1: Int, // should be positive 
x2: Int) // should be even

更具体地说,我需要一个函数 checkX: X => Status[X]。此外,我想将 checkX 写成 isPositiveisEven组合

val checkX: X => Status[X] =
({x => isPositive(x.x1)} |@| {x => isEven(x.x2)}) ((X.apply _).lift[Status])

有意义吗?
您如何将 checkX 编写为 isPositiveisEven组合

最佳答案

有很多种写法,但我喜欢以下几种:

val checkX: X => Status[X] = x => isPositive(x.x1).tuple(isEven(x.x2)).as(x)

或者:

val checkX: X => Status[X] =
x => isPositive(x.x1) *> isEven(x.x2) *> x.point[Status]

关键是您只想针对它们的“效果”运行这两个验证,然后在新上下文中返回原始值。正如您自己的实现所示,这是一个完全合法的应用操作。只有一些稍微好一点的方式来编写它。

关于scala - 如何编写返回验证的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30568926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com