2013-06-20 3 views
6

Warum ist es nicht notwendig, den Aufzug zu verwenden, um eine Funktion in einer internen Monodentrafoumgebung auszuführen, außer für IO? Ich meine, wenn ich StateT über WriterT und WriterT über ReaderT habe, warum kann ich das tun?Monad Transformatoren und Hubfunktion

tell $ {- any code here for the Writer -} 
foo <- asks {- This for the reader -} 
and so on... 

statt

lift $ tell $ {- code ... -} 
... 

Gibt es eine spezielle Erklärung oder es ist nur die Art, wie die Monade Transformers geschrieben wurden?

+3

Schauen Sie sich [alle Instanzen 'WriterT' hat] (http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-Writer-Lazy.html#control.i : SchriftstellerT). – icktoofay

+1

Beachten Sie, dass Sie, wenn Sie die 'transformers'-Bibliothek anstelle von' mtl' verwenden, alles explizit "heben" müssen. –

Antwort

7

Es ist, weil die Monad Transformer Library (MTL) erkennt, dass es ziemlich üblich ist, Monaden auf diese Weise zu stapeln, so dass sie nicht tell als nur eine Funktion (Mondoid w) => w -> Writer() definieren.

Stattdessen haben sie MonadWriter die als ein typeclass mit tell als Funktion darin definiert ist. Dann definieren sie eine Tonne Instanzen von MonadWriter: ReaderT, IO, Writer (duh) usw. Und damit vermeiden Sie die lästige Wiederholung von lift..

Dies ist durchaus üblich, jeder Monade-Transformator (in MTL) wird eine Control.Monad.***.Class haben, die diese Art von Klasse hat.

+0

Ich verstehe !, Ich habe nicht die Instanzen der Monaden gelesen. Vielen Dank – Jcao02