Creo que todo se reduce al Principle of Least Astonishment. Usar Either
para codificar el éxito o el fracaso es claramente algo que la gente hace, pero no es el único uso de Either
. De hecho, no hay muchas razones para que Right
sea exitoso y Left
sea una falla distinta de la tradición. Como menciona el comentario de adelbertc anterior, scalaz tiene Validation
que codifica específicamente esto.
Para justificar aún más la demanda por encima de POLA, tome este código:
def foo(): Either[Int, Int] = Right(1)
def bar(j: Int): Either[Int, Int] = Left(1)
def baz(z: Int): Either[Int, Int] = Right(3)
// Result is Left(1)
for (a <- foo().right; b <- bar(a).right; c <- baz(b).right) yield c
Esto compila porque estoy utilizando la proyección .right
en la expresión for
. Tiene sentido aquí el Left(1)
en bar
es el caso de falla y ese es el resultado, pero imagine si Either
fue Right
-biased. El código anterior se compilará sin los .right
proyecciones en la expresión como:
for (a <- foo(); b <- bar(a); c <- baz(b)) yield c
Si utilizó Either
en el código para ser sólo un "uno-a-la-otra o" tipo, usted se sorprenderá por (1) el hecho de que esto compilaría y (2) devuelve Left(1)
y aparentemente nunca ejecuta baz
.
En resumen, use Validation
si desea usar Either
para codificar el éxito o el fracaso.
Realmente no responde la pregunta, pero si revisa la 'Validación' de Scalaz que parece ser lo que está buscando, más o menos. – adelbertc