Acompanhamento O que é um exemplo de uma Mônada que é uma Alternativa, mas não uma MonadPlus? :
Suponha que é uma mônada. Quais são as relações betweem ser uma alternativa , um MonadPlusCatch e uma MonadPlusDistr ? mPara cada um dos seis pares possíveis, eu gostaria de ter uma prova de que um implica outro ou um contra-exemplo de que não.
(Estou a usar
MonadPlusCatch para distinguir um MonadPlus que satisfaça a regra de captura esquerda :
mplus (return a) b = return a
MonadPlusDistr para distinguir um MonadPlus que satisfaz a regra de distribuição esquerda :
mplus a b >>= k = mplus (a >>= k) (b >>= k)
veja MonadPlus no HaskellWiki .)
Meu conhecimento atual + intuição é que:
- MonadPlusDist Alternativa -
provavelmenteverdadeira -parece simples, acredito que tenho um esboço de uma prova, vou verificá-la e, se estiver correta, publicareiAndrewC respondeu a esta parte. - Alternative MonadPlusDist - false - como AndrewC mostrou em sua resposta : é uma alternativa , mas sabe-se que não é MonadPlusDist (é MonadPlusCatch ).
Maybe
MonadPlusCatch Alternativa -
provavelmentefalsa - acredito que (ou basicamente qualquer coisa ) deva servir como um contra-exemplo. A razão é queMaybeT (Either e)
MaybeT m'
((pure x) <|> g) <*> a = -- LeftCatch (pure x) <*> a -- which in general cannot be equal to ((pure x) <*> a) <|> (g <*> a)
novamente eu vou verificar e postar. (Curiosamente, apenas por
Maybe
ser possível, porque podemos analisar sea
éJust something
ouNothing
- veja a resposta de AndrewC acima mencionada.)- Alternativa MonadPlusCatch -
provavelmentefalso - se provar que MonadPlusDist alternativa , em seguida, irá servidor como um contra-exemplo. (Ou podemos provar explicitamente leis alternativas para .)→[]
[]
- MonadPlusDist MonadPlusCatch - false - é um contra-exemplo conhecido.
[]
- MonadPlusCatch MonadPlusDist - false - é um contra-exemplo conhecido.
Maybe
f <$>
não realiza nenhuma ação idiomática, é pura, portanto pode ser possível "mudar de lado".[]
.[]
satisfaça o MonadPlusCatch? No momento, é apenas uma afirmação no HaskellWiki.>>= k
é definida explicitamente usandofoldr ((++).k)
Na verdade é
MaybeT Either
:A saída é
o que significa que
MaybeT Either
falha na lei de distribuição esquerda deApplicative
.A razão é que
ignora
g
(devido ao LeftCatch ) e avalia apenas paramas isso é diferente do que o outro lado avalia:
fonte