Vous semblez utiliser la validation pour l'effet secondaire. Ce n'est pas ce à quoi cela sert. Vous utilisez les valeurs de retour dans la programmation fonctionnelle.
La validation dans un pour la compréhension se poursuit en cas de succès, mais casse à un échec et renvoie l'échec.
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)
Salut, c'est un peu étrange de voir ce que vous voulez réaliser. Si vous voulez enchaîner les validations, je suggère de regarder ici (applicatif) à la ligne 97 peut-être cela aide: https: //github.com/scalaz/scalaz/blob/master/example/src/main/scala/scalaz/example/ExampleValidation .scala – AndreasScheinert