おそらく、エラーを蓄積したり、結果を計算したりする方法を探しているでしょう。あなたはmacculkin operatorに興味があるかもしれません。つまり、パイプのパイプまたは|@|
(最も好きな名前を選択してください) ;)
使用例。エラーがどのように蓄積されるかを確認します ( OMG!とHolly mum!が結果に含まれます。
import scalaz._
import Scalaz._
val v1: ValidationNel[Throwable, Int] = 1.successNel
val v2: ValidationNel[Throwable, Int] = new RuntimeException("OMG!").failNel
val v3: ValidationNel[Throwable, Int] = new RuntimeException("Holly mom!").failNel
val sum : ValidationNel[Throwable, Int] = (v1 |@| v2 |@| v3 ) (_ + _ + _)
//scala> sum: scalaz.ValidationNel[Throwable,Int] = Failure(NonEmptyList(java.lang.RuntimeException: OMG!, java.lang.RuntimeException: Holly mom!))
よくある間違いは、理解機能またはマップ機能に使用することを選択した場合です。そのような方法に従うことにした場合、エラーを蓄積することはできません。OMGのみ!蓄積されます。下記参照:
for( val1 <- v1;
val2 <- v2;
val3 <- v3
) yield(val1 + val2 + val3)
//res0: scalaz.Validation[scalaz.NonEmptyList[Throwable],Int] = Failure(NonEmptyList(java.lang.RuntimeException: OMG!))