5

Nick Partridge 关于派生 scalaz 的演示中,基于旧版本的 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)

它应用测试并返回带有失败消息的验证。使用 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)
               ^

这个组合器的scalaz 7等价物是什么?

4

2 回答 2

5

这现在称为tuple,因此您可以编写例如:

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 标记、搜索然后比较签名更好的方法来找出这种事情。

于 2015-10-07T16:58:12.207 回答
-1

您想使用|@|运算符。

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))

将其与tuple运算符进行比较:

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))
于 2015-10-07T21:31:04.010 回答