scalaz 7相当于`<|*|>;`来自scalaz 6
在中,基于较旧版本的scalaz,他引入了使用函数的验证:scalaz 7相当于`<|*|>;`来自scalaz 6,scala,scalaz,scalaz7,Scala,Scalaz,Scalaz7,在中,基于较旧版本的scalaz,他引入了使用函数的验证: def even(x: Int): Validation[NonEmptyList[String], Int] = if (x % 2 == 0) x.success else { s"not even: $x".wrapNel.failure } 然后他使用 even(1) <|*|> even(2) 偶数(1)偶数(2) 它应用测试并返回带有失败消息的验证。使用scalaz 7我可以 scala> eve
def even(x: Int): Validation[NonEmptyList[String], Int] =
if (x % 2 == 0) x.success else { s"not even: $x".wrapNel.failure }
然后他使用
even(1) <|*|> even(2)
偶数(1)偶数(2)
它应用测试并返回带有失败消息的验证。使用scalaz 7我可以
scala> even(1) <|*|> even(2)
<console>:18: error: value <|*|> is not a member of scalaz.Validation[scalaz.NonEmptyList[String],Int]
even(1) <|*|> even(2)
^
scala>偶数(1)偶数(2)
:18:错误:值不是scalaz.Validation[scalaz.NonEmptyList[String],Int]的成员
偶数(1)偶数(2)
^
scalaz 7与此组合器的等价物是什么?这现在称为
元组,因此您可以编写以下示例:
import scalaz._, Scalaz._
def even(x: Int): Validation[NonEmptyList[String], Int] =
if (x % 2 == 0) x.success else s"not even: $x".failureNel
val pair: ValidationNel[String, (Int, Int)] = even(1) tuple even(2)
不幸的是,我不确定有没有更好的方法来发现这种情况,而不是检查源代码的最后6.0标记,搜索,然后比较签名。您想使用@
操作符
scala> (even(1) |@| even(2) |@| even(3)) { (_,_,_) }
<console> Failure(NonEmptyList(not even: 1, not even: 3))
scala> (even(2) |@| even(4) |@| even(6)) { (_,_,_) }
<console> Success((2,4,6))
您不想使用|@
运算符吗?你发布的视频没有提到它,但你可以在这里找到更多关于它的信息:特别是你可以编写scala>(偶数(1)| | | | |偶数(2)| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
@mjaskowski@
非常通用,如果您只想将两个值压缩在一个元组中,元组(以前称为
)更合适。您肯定可以在这里使用@
,但我看不到任何迹象表明这是OP想要的<代码>.@.
存在于Scalaz 6中,并且做了与7中相同的事情-
是一种更具体的东西,它的名称发生了变化。在验证场景中,.
上的元组有什么好处?为什么场景很重要?当你想要一个元组时,tuple
比|@
更精确、功能更少、可读性更强、意图更清晰——这些都是你喜欢它的原因。无论如何,对于学习验证的人来说,|@
的知识至少和tuple
的知识一样重要。在所讨论的特定示例中,这两个都很好。在7.0中有一个弃用注释指向tuple
,但在7.1中这一点自然消失了。有一个输入错误。费内尔应该是failureNel@CloudtechfailNel
在7.1中仍然存在,但它已被弃用,因此我对其进行了更改。
scala> even(1) tuple even(2) tuple even(3)
<console> Failure(NonEmptyList(not even: 1, not even: 3))
scala> even(2) tuple even(4) tuple even(6)
<console> Success(((2,4),6))