2011-09-22 15 views
18
import scalaz._ 
import Scalaz._ 

"abc".parseInt 

Esto devolverá un Validation[NumberFormatException, Int]. ¿Hay alguna manera de aplicar una función en el lado de la falla (como toString) para obtener un Validation[String, Int]?Mapa en la falla de validación de Scalaz

Respuesta

19

Hay un par de métodos <-: y :-> definido en MAB[M[_,_], A, B] que se asignan en el lado izquierdo y derecho de cualquier M[A, B], siempre y cuando hay un Bifunctor[M]. Validation pasa a ser un bifuntor, por lo que se puede hacer esto:

((_:NumberFormatException).toString) <-: "123".parseInt 

inferencia de tipos de Scala generalmente fluye de izquierda a derecha, por lo que este es en realidad más corto:

"123".parseInt.<-:(_.toString) 

y requiere menos anotación.

+0

Agradable. Me pregunto si lo siguiente podría ser útil en MAB: def bimap [C, D] (primero: A => C = identidad [A] \ _, segundo: B => D = identidad [B] \ _) (b implícito : Bifunctor [M]): M [C, D] = b.bimap (valor, primero, segundo). Así que obtenemos "123" .parseInt.bimap (\ _. ToString) –

+0

Eso sería genial. Enviar una solicitud de extracción. – Apocalisp

11

Hay un functor en FailProjection. Por lo que podría hacer

v.fail.map(f).validation 

(no puede escribir como FailProjection, validación para salir de ella)

Alternativamente

v.fold(f(_).failure, _.success) 

Tanto un poco prolijo. Tal vez alguien más familiarizados con scalaz puede llegar a algo mejor

+0

no se puede obtener el 'f andthen Failure' para funcionar:' "123" .parseInt.fold (_. ToString andThen Failure) 'imprime' type incompega'. El otro funciona bien. – huynhjl

+1

@huynhjl: fold tiene dos funciones: la primera para el caso de error, la segunda para el caso de éxito. v.fold (_. toString.fail, _.success) funciona –

+0

Pero los argumentos de plegado tienen valores predeterminados (identidades) ¿no es así? –

Cuestiones relacionadas