2013-05-14 18 views
9

Poiché ogni Monad è un Monoid sull'operazione di sequenziamento. Perché l'Monoid non eredita Monoid in haskell?Ogni monade è monoide?

+0

Che cosa intendi esattamente con "operazione di sequenziamento" qui? –

+2

@Rhymoid: Sono abbastanza sicuro che sia '>>'. –

+0

@TikhonJelvis: una forma limitata di '>>', giusto? –

risposta

12

Non deve necessariamente essere un Monad, questo funziona per ogni Applicative. Quindi sì, è possibile definire:

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

Ma questo significa che si dovrà fornire l'istanza Monoid ogni volta che si scrive un'istanza Applicative. Questo può essere abbastanza fastidioso, certamente dal momento che questa istanza Monoid non viene utilizzata molto spesso.

Una soluzione migliore consiste nel creare un wrapper newtype attorno a f() e quindi è possibile fornire un'istanza Monoid per tutti i funtori applicativi una volta per tutte. Ce n'è uno prontamente disponibile in the reducers package.