No es que esté golpeando el mismo tambor de nuevo, pero ...
Una solución para el problema en el que tenemos un número de procesos que pueden producir una salida exitosa, o no con algún mensaje de error. El objetivo es agregar los resultados exitosos, si todos los procesos producen un éxito y si uno o más fallan, agregar todos los mensajes de error.
Esto se puede resolver mediante scalaz validación: primer lugar, la configuración de algunas importaciones
scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._
Ahora vamos a definir nuestros "procesos"
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]
Ahora usa Applicative
para agregar los fallos/éxitos:
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
Ahora vamos a tratar de algunos fallos:
scala> attempt("a", "b", "true")
java.lang.NumberFormatException: For input string: "a"
java.lang.NumberFormatException: For input string: "b"
Ahora vamos a probar para el éxito:
scala> attempt("1", "2.3", "false")
Found 1 2.3 false
Me gusta este el ¡más! Es mi pregunta, así que me permiten ser subjetivo :) –