haskell - Mapeo sobre la izquierda de cualquiera de los dos
either (4)
Esto se puede hacer fácilmente con la lens :
import Control.Lens
over _Left (+1) $ Left 10 => Left 11
over _Left (+1) $ Right 10 => Right 10
over _Right (+1) $ Right 10 => Right 11
En algún lugar de mi aplicación, recibo un Either ParserError MyParseResult
de Parsec. Aguas abajo, este resultado hace que se realice otro análisis sobre el uso de otras bibliotecas. Durante esa segunda fase de análisis también puede ocurrir algún tipo de error que me gustaría pasar como una Left String
, pero para eso también necesito convertir el resultado de Parsec a String
. Para lograrlo, necesito una función que me permita mapear sobre una Left
con una función show
.
La función de mapeo en la que estoy pensando se ve algo como esto:
mapLeft :: (a -> b) -> Either a c -> Either b c
mapLeft f (Left x) = Left $ f x
mapLeft _ x = x
Pero me sorprendió bastante no encontrar nada que coincida con hackage db. Así que ahora tengo dudas de si estoy usando un enfoque correcto para mi problema.
¿Por qué no existe tal función en la biblioteca estándar? ¿Qué hay de malo con mi enfoque?
Otra opción es usar la instancia de Bifunctor
de Either
de las Either
. Entonces tiene
first :: (a -> b) -> Either a c -> Either b c
(También se puede usar Bifunctor
para atravesar la primera parte de (a,b)
.)
Otra opción simple es mapLeft
en Data.Either.Combinators
:
mapLeft :: (a -> c) -> Either a b -> Either c b
Tenemos tal función en las bibliotecas estándar,
Control.Arrow.left :: a b c -> a (Either b d) (Either c d)
Es la generalización a flechas arbitrarias. Sustituye (->)
por a
infijo y aplícalo, para obtener la especialización.
left :: (b -> c) -> Either b d -> Either c d
No hay nada malo con su enfoque, en principio, es una forma sensata de manejar la situación.