Validation scalaz验证和列表单子

Validation scalaz验证和列表单子,validation,scala,scalaz,Validation,Scala,Scalaz,我试图提出类似于以下内容的想法: 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 defs2(i:Int):

我试图提出类似于以下内容的想法:

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
defs2(i:Int):验证[String,Int]=i.success
val结果=用于{

i如果您有一个
a
的验证列表,您可以使用
序列将其转换为
a
的验证列表:

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"
val result=for{

i您似乎在使用验证来处理副作用。这不是它的目的。您在函数编程中使用返回值

对于理解的验证在成功时继续,但在失败时中断并返回失败

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)
scala>def g(i:Int):验证[String,Int]={
println(i);if(i%2==0)i.success else“奇数”。失败
}
g:(i:Int)scalaz.Validation[String,Int]
scala>val result=for{

|您好,看到您想要实现的目标有点奇怪。如果您想链接验证,我建议您看看这里(应用程序)第97行可能会有帮助:很好。这正是我要找的。谢谢。对不起,回答得太快了。这几乎就是我要找的。在这里,列表中的所有验证都是计算出来的。我希望在收到失败后停止计算。我该如何做?目前无法测试它,但尝试使用
(即惰性列表)而不是
list
,或
list(1,2).view.map(s2).
.view只是不编译。使用stream.from(-100)显式创建流(我使用了另一个s函数,它确保i大于0)会导致堆栈溢出。还请注意,如果希望“先失败”,则需要导入Validation.Monad.\uu序列的语义。