Qual é o exemplo de uma Mônada que é uma alternativa, mas não uma MonadPlus?
Emsua resposta para a questão“Distinção entre typeclassesMonadPlus
, Alternative
eMonoid
?Edward Kmett diz que
Além disso, mesmo seApplicative
foi uma superclasse deMonad
, você acabaria precisando doMonadPlus
classe de qualquer maneira, porque obedecendo
empty <*> m = empty
não é estritamente suficiente para provar que
empty >>= f = empty
Então, alegando que algo é umMonadPlus
é mais forte do que afirmar que éAlternative
.
É claro que qualquer functor aplicativo que énão uma mônada é automaticamente um exemplo deAlternative
que não é umMonadPlus
, mas a resposta de Edward Kmett implica que existe umamonga que é umAlternative
mas não umMonadPlus
: Estáempty
e<|>
satisfaria oAlternative
leis,1 mas não oMonadPlus
leis.2 Eu não consigo dar um exemplo disso sozinho. Alguém sabe de um?
1 Não consegui encontrar uma referência canônica para um conjunto deAlternative
leis, mas eu esqueço o que eu acredito que eles sejam mais ou menos na metademinha resposta para a questão“Confuso pelo significado doAlternative
tipo class e seu relacionamento com outras classes de tipos ” (procure a frase “distributividade direita”). As quatro leis que eu acredito que devem conter são:
<*>
): (f <|> g) <*> a = (f <*> a) <|> (g <*> a)
Absorção correta (para<*>
): empty <*> a = empty
Distribuidora esquerda (defmap
): f <$> (a <|> b) = (f <$> a) <|> (f <$> b)
Absorção esquerda (porfmap
): f <$> empty = empty
Eu também ficaria feliz em aceitar um conjunto mais útil deAlternative
leis.
2 Eu sei dissohá alguma ambiguidade sobre o que oMonadPlus
leis são; Estou feliz com uma resposta que usa distribuição esquerda ou captura à esquerda, embora eu prefira fracamente a primeira.