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:

Właściwa dystrybucja (z<*>):  (f <|> g) <*> a = (f <*> a) <|> (g <*> a)Właściwa absorpcja (dla<*>):  empty <*> a = emptyDystrybucja 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ą.

questionAnswers(1)

yourAnswerToTheQuestion