2015-04-22 69 views
1

我与Scalaz验证工作的清单,我碰到这样的情况下(注意,这在很大程度上从我的实际代码的简化,但这个想法是一样的)Scalaz使用与验证应用性建设者和验证

考虑:

case class Foo(bar: Int) 

val x1: Validation[String, Foo] = Foo(1).success 
val x2: Validation[String, Foo] = Foo(2).success 
val x3: Validation[String, Foo] = Foo(3).success 

val l1 = List(x1, x2) 

我想能够做到沿线一些这样的:

(x3 |@| l1) { (x1, x2, x3) => /*do something with all of my Foo's*/ } 

当然,如果有任何的错误,无论是在列表或外名单我想积累起来,因为他们通常会。

我知道上面语法不工作,但关于如何实现我正在寻找的结果没有任何意见,将不胜感激。

+2

我不知道我确切地理解你的要求,但你知道,'l1.sequenceU'会给你包含'x1'和'x2'列表的验证? –

+0

啊,我没有意识到这一点。刚刚尝试过,这就是诀窍。谢谢。 –

回答

2

如果你有List[F[A]]F有一个适用函子实例,你可以在里面打开列表输出与sequenceU效果得到F[List[A]]

scala> l1.sequenceU 
res0: scalaz.Validation[String,List[Foo]] = Success(List(Foo(1), Foo(2))) 

或者:

scala> (x3 |@| l1.sequenceU) { 
    case (third, rest) => // do something with the values 
} 

这是另外值得注意的是,如果你发现自己写的xs.map(f).sequenceU的东西,你可以用xs.traverseU(f)代替,它只是你不建立一个中间体L是完全等价IST。