2013-06-20 82 views
6

爲什麼不需要在內部monad變壓器環境中使用電梯執行功能,IO除外?我的意思是,如果我在WriterT和WriterT上使用了ReaderT,我爲什麼要這樣做?Monad變壓器和電梯功能

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

代替

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

是否有特別說明,或者只是單子變形金剛寫的方式嗎?

+3

看看[所有'WriterT'的實例都有](http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-Writer-Lazy.html#control.i :WriterT)。 – icktoofay

+1

請注意,如果您使用'transformers'庫而不是'mtl',那麼您將不得不明確地提起所有內容。 –

回答

7

這是因爲Monad變壓器庫(MTL)認識到,你以這種方式堆疊monad是相當普遍的,因此他們沒有將tell定義爲僅僅是一些函數(Mondoid w) => w -> Writer()

相反,他們有MonadWriter其定義爲與給類型類作爲它的功能。然後他們定義了一大堆MonadWriter的實例:ReaderT,IO,Writer(duh)等。因此,您可以避免令人討厭的重複lift.

這是相當普遍的,任何monad變壓器(在MTL中)將有一個Control.Monad.***.Class它有這種typeclass。

+0

我明白了,我沒有讀過Monads的實例。謝謝 – Jcao02