2010-11-17 12 views
19

Ich benutze das Paar Rechtschreibung Writer die ganze Zeit, aber ich selbst immer instanziiert müssen:Ist die `Monad ((,) w)` Instanz irgendwo Standard?

instance (Monoid w) => Monad ((,) w) where 
    return x = (mempty, x) 
    ~(w,x) >>= f = let (w', y) = f x in (w `mappend` w', y) 

Enthält diese in den Standardbibliotheken leben überall?

+7

Nun, da Sie es erwähnen, ist es ziemlich merkwürdig, dass 'Control.Monad.Instances' die' Functor' -Instanz für '((,) a)' 'nicht aber eine' Monad' -Instanz enthält, obwohl der anonyme Leser ' (->) e) 'und anonymer Fehler" Entweder e ". –

+0

Siehe auch http://StackOverflow.com/questions/4211150/why-isnt-implemented-with-control-monad-instances-by-default –

+0

@McCann: Wie implementieren Sie eine Monad-Instanz für '((,) a) '? Zum Beispiel habe ich keine Ahnung, wie man 'return' implementiert. –

Antwort

8

Wie camccann im Kommentar erwähnt, definiert Control.Monad.Instances nur die Functor Instanz.

Control.Monad.Applicative definiert die Applicative Instanz.

Das transformers Paket und damit auch Version 2 und oberhalb des mtl Pakets, eine Wrapperfunktion writer :: (a, w) -> Writer w a definieren.

Aber ich habe nirgends die Monad Instanz gefunden.