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序列的语义。