Seguimiento ¿Cuál es un ejemplo de una mónada que es una alternativa pero no una MonadPlus? :
Supongamos que es una mónada. ¿Cuáles son las relaciones betweem m ser una alternativa , un MonadPlusCatch y una MonadPlusDistr ? Para cada uno de los seis pares posibles, me gustaría tener una prueba de que uno implica otro, o un contraejemplo de que no.
(Estoy usando
MonadPlusCatch para distinguir un MonadPlus que satisfaga la regla Left-Catch :
mplus (return a) b = return a
MonadPlusDistr para distinguir un MonadPlus que satisface la regla de distribución izquierda :
mplus a b >>= k = mplus (a >>= k) (b >>= k)
ver MonadPlus en HaskellWiki .)
Mi conocimiento actual + intuición es que:
- MonadPlusDist Alternativa -
probablementecierto -parece sencillo, creo que tengo un boceto de una prueba, lo comprobaré y si es correcto, lo publicaréAndrewC respondió esta parte. -
Maybe
MaybeT (Either e)
MaybeT m'
((pure x) <|> g) <*> a = -- LeftCatch (pure x) <*> a -- which in general cannot be equal to ((pure x) <*> a) <|> (g <*> a)
nuevamente lo revisaré y publicaré. (Curiosamente, solo
Maybe
es demostrable, porque podemos analizar sia
esJust something
oNothing
, ver la respuesta de AndrewC antes mencionada).-
[]
[]
-
[]
-
Maybe
f <$>
no conlleva ninguna acción idiomática, es pura, por lo que podría ser posible de alguna manera "cambiar de lado".[]
.[]
satisfaga MonadPlusCatch? Por el momento, es solo una afirmación sobre HaskellWiki.>>= k
se define explícitamente usandofoldr ((++).k)
De hecho es
MaybeT Either
:La salida es
lo que significa que
MaybeT Either
falla la ley de distribución izquierda deApplicative
.La razón es que
ignora
g
(debido a LeftCatch ) y evalúa solo parapero esto es diferente de lo que evalúa el otro lado:
fuente