haskell either

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.