2015-04-22 63 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。