scalaz 7相当于`<|*|>;`来自scalaz 6

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

在中,基于较旧版本的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> 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@Cloudtech
failNel
在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))