2013-05-14 9 views
9

Ponieważ co Monad jest Monoid w sprawie operacji sekwencjonowania. Dlaczego Monad nie dziedziczy Monoid w haskell?Każda monada jest monoidalna?

+0

Co dokładnie masz na myśli, mówiąc o "operacji sekwencjonowania"? –

+2

@Rhymoid: Jestem prawie pewien, że to ">>". –

+0

@ TikhonJelvis: Ograniczona forma słowa ">>", prawda? –

Odpowiedz

12

Nie musi to być Monad nawet, działa to dla każdego Applicative. Tak więc, można zdefiniować:

class (Functor f, Monoid (f())) => Applicative f where 

Ale to oznacza, że ​​trzeba by dostarczyć instancji Monoid każdym razem piszesz instancję Applicative. To może być dość irytujące, ponieważ instancja Monoid nie byłaby używana bardzo często.

Lepszym rozwiązaniem jest utworzenie opakowania nowego typu o numerze f(), a następnie udostępnienie instancji Monoid dla wszystkich funktorów aplikacyjnych raz na zawsze. Jest jeden dostępny w the reducers package.