我正在尝试提出类似于以下内容的内容:
val s: Validation[String, Int] = 1.success
def s2(i: Int): Validation[String, Int] = i.success
val result = for {
i <- s
j <- List(1, 2)
k <- s2(j)
} yield "fine";
上面的代码无法编译,我理解,在语法上它没有意义。
我正在尝试以单子方式执行验证列表。我该如何做到这一点?
我正在尝试提出类似于以下内容的内容:
val s: Validation[String, Int] = 1.success
def s2(i: Int): Validation[String, Int] = i.success
val result = for {
i <- s
j <- List(1, 2)
k <- s2(j)
} yield "fine";
上面的代码无法编译,我理解,在语法上它没有意义。
我正在尝试以单子方式执行验证列表。我该如何做到这一点?
如果您有 的验证列表A
,则可以将其转换为A
using列表的验证sequence
:
List(1, 2).map(s2).sequence[({type l[a]=Validation[String, a]})#l, Int]
(如果我正确理解了这个问题)。所以你得到
val result = for {
i <- s
k <- List(1, 2).map(s2).sequence[({type l[a]=Validation[String, a]})#l, Int]
} yield "fine"
您似乎正在使用验证来解决副作用。这不是它的目的。您在函数式编程中使用返回值。
对于理解的验证在成功时继续进行,但在失败时中断并返回失败。
scala> def g(i: Int): Validation[String, Int] = {
println(i); if(i % 2 == 0) i.success else "odd".fail
}
g: (i: Int)scalaz.Validation[String,Int]
scala> val result = for {
| i <- g(1)
| j <- g(2)
| } yield (i,j)
1
result: scalaz.Validation[String,(Int, Int)] = Failure(odd)
scala> val result = for {
| i <- g(2)
| j <- g(1)
| } yield (i,j)
2
1
result: scalaz.Validation[String,(Int, Int)] = Failure(odd)
scala> val result = for {
| i <- g(2)
| j <- g(2)
| } yield (i,j)
2
2
result: scalaz.Validation[String,(Int, Int)] = Success((2,2))
scala> val result = for {
| i <- g(1)
| j <- g(1)
| } yield (i,j)
1
result: scalaz.Validation[String,(Int, Int)] = Failure(odd)