¿Qué mónada es la opuesta a la mónada de error en haskell?

8

En la mónada de errores, el primer fallo detiene cualquier ejecución, simplemente llevando la falla a través de los siguientes enlaces.

¿Qué mónada se detiene en el éxito solo llevando los éxitos hacia adelante, y básicamente tragando cualquier falla e intentando el siguiente enlace sin tener en cuenta el fracaso de la anterior?

La mónada de error podría usarse para tratar este fracaso como un éxito, pero tengo curiosidad por saber si las bibliotecas predeterminadas tienen una mónada para este propósito específico, casi como una mónada O en mi mente "Haz esto o eso" / p>

Editar:

El comportamiento sería:

Left "fail" >>= (\x -> Right "win") >>= (\x -> Left "ahh neener") >>= (\x -> Right (x + " yay"))

En la mónada de error, el primer valor a la izquierda solo se transfiere, por lo que el resultado es Left "fail" . El comportamiento que quiero es donde lo anterior devuelve Right "win yay" es una mónada trivial para implementar que podría escribir yo mismo, pero me di cuenta de que existía algo para hacer eso (tal vez no utilice Either, pero eso es lo primero que me viene a la mente por tal comportamiento).

    
pregunta Jimmy Hoffa 20.01.2013 - 01:29

1 respuesta

4

Lo que necesita es MonadPlus (vea también wiki de Haskell ). Define

mzero :: m a

que representa un error no especificado, y

mplus :: m a -> m a -> m a

que intenta el segundo cálculo, si el primero falla. También se proporcionan algunas funciones auxiliares:

-- Extends 'mplus' to lists of computations:
msum :: MonadPlus m => [m a] -> m a
-- Fails a computation conditionally.
guard :: MonadPlus m => Bool -> m ()
-- Filter (fail) computations that don't satisfy the predicate.
mfilter :: MonadPlus m => (a -> Bool) -> m a -> m a

Las instancias de MonadPlus se pueden dividir en dos categorías:

  1. mplus combina todos los resultados posibles de ambos argumentos (cumple con la ley de Distribución Izquierda). [] y Seq son probablemente las únicas instancias con este comportamiento.
  2. mplus selecciona el argumento de la izquierda, si contiene un valor válido, de lo contrario, selecciona el correcto (cumple con la ley de captura izquierda). Las instancias con este comportamiento son Maybe , Either , STM y IO .

(la instancia MonadPlus de Either solía definirse en Control.Monad.Error as

instance (Error e) => MonadPlus (Either e) where
    mzero            = Left noMsg
    Left _ 'mplus' n = n
    m      'mplus' _ = m

pero por alguna razón parece que falta en la versión actual.)

Vea también MonadPlus en Wikibooks y Definición de MonadPlus para Haskell IO .

    
respondido por el Petr Pudlák 20.01.2013 - 14:07

Lea otras preguntas en las etiquetas