Non pas que je suis à nouveau frapper le même tambour, mais ...
Une solution pour le problème où nous avons un certain nombre de processus qui peut produire une sortie réussie, ou échouer avec un certain message d'erreur. Le but est d'agréger les résultats positifs, si tous les processus produisent un succès et si un ou plusieurs échoue, d'agréger tous les messages d'erreur.
Ceci peut être résolu par scalaz validation: tout d'abord, la configuration des importations
scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._
Maintenant, nous allons définir nos "processus"
scala> def fooI(s : String) : ValidationNEL[Exception, Int] = s.parseInt.liftFailNel
fooI: (s: String)scalaz.Scalaz.ValidationNEL[Exception,Int]
scala> def fooF(s : String) : ValidationNEL[Exception, Float] = s.parseFloat.liftFailNel
fooF: (s: String)scalaz.Scalaz.ValidationNEL[Exception,Float]
scala> def fooB(s : String) : ValidationNEL[Exception, Boolean] = s.parseBoolean.liftFailNel
fooB: (s: String)scalaz.Scalaz.ValidationNEL[Exception,Boolean]
utiliser maintenant Applicative
pour agréger les échecs/succès:
scala> def attempt(ss : String*) = (fooI(ss(0)) <|**|> (fooF(ss(1)), fooB(ss(2)))) match {
| case Success((i, f, b)) => println("Found " + i + " " + f + " " + b)
| case Failure(es) => es foreach println
| }
attempt: (ss: String*)Unit
Maintenant, nous allons essayer de quelques échecs:
scala> attempt("a", "b", "true")
java.lang.NumberFormatException: For input string: "a"
java.lang.NumberFormatException: For input string: "b"
Maintenant, nous allons essayer de succès:
scala> attempt("1", "2.3", "false")
Found 1 2.3 false
J'aime celui-ci le plus! C'est ma question, donc je suis autorisé à être subjectif :) –