Jaki jest przykład Monady, która jest alternatywą, ale nie MonadPlus?
Wjego odpowiedź do pytania„Rozróżnienie między typamiMonadPlus
, Alternative
, iMonoid
? ”, Edward Kmett tak mówi
Ponadto, nawet jeśliApplicative
była superklasąMonad
, skończyłbyś potrzebowaćMonadPlus
klasa i tak, ponieważ słuchanie
empty <*> m = empty
nie jest wystarczająco ścisłe, aby to udowodnić
empty >>= f = empty
Więc twierdząc, że coś jestMonadPlus
jest silniejszy niż twierdzenie, że jestAlternative
.
Jasne jest, że każdy aplikacyjny funktor, który jestnie monada jest automatycznie przykłademAlternative
co nie jestMonadPlus
, ale odpowiedź Edwarda Kmetta sugeruje, że istniejemonad który jestAlternative
ale nieMonadPlus
: jegoempty
i<|>
zadowoliAlternative
prawa,1 ale nieMonadPlus
prawa.2 Nie mogę sam wymyślić tego przykładu; czy ktoś wie o jednym?
1 Nie byłem w stanie znaleźć kanonicznego odniesienia do zestawuAlternative
prawa, ale przedstawiam to, co uważam za mniej więcej w połowiemoja odpowiedź do pytania„Zdezorientowany znaczeniemAlternative
klasa typu i jej związek z innymi klasami typów ” (szukaj frazy „właściwa dystrybucja”). Cztery prawa, które moim zdaniem powinny obowiązywać, to:
<*>
): (f <|> g) <*> a = (f <*> a) <|> (g <*> a)
Właściwa absorpcja (dla<*>
): empty <*> a = empty
Dystrybucja po lewej (zfmap
): f <$> (a <|> b) = (f <$> a) <|> (f <$> b)
Lewa absorpcja (dlafmap
): f <$> empty = empty
Z radością przyjmuję także bardziej użyteczny zestawAlternative
prawa.
2 wiem toistnieje pewna niejasność co do tego, coMonadPlus
prawa są; Cieszę się z odpowiedzi, która wykorzystuje dystrybucję lewą lub lewą, chociaż słabo wolałbym tę pierwszą.