2013-06-20 5 views
6

なぜIOを除く内部モナドトランス環境で機能を実行するためにリフトを使用する必要はありませんか?つまり、私はStateT over WriterTとWriterT over ReaderTを持っていれば、なぜこれを行うことができますか?モナドトランスフォーマーとリフト機能

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

代わりの

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

特別な説明がありますか、それはモナド変圧器が書かれた唯一の方法ですか?

+3

[すべてのインスタンス 'WriterT' has](http://hackage.haskell.org/packages/archive/mtl/latest/doc/html/Control-Monad-Writer-Lazy.html#control.i)を見てください。 :WriterT)。 – icktoofay

+1

'mtl'の代わりに' transformers'ライブラリを使用すると、明示的にすべてをリフトする必要があることに注意してください。 –

答えて

7

モナドトランスフォーマライブラリ(MTL)は、ちょうどそのようにモナドをスタックすることがよくあるので、としてtellを定義していないためです。

代わりにMonadWriterがあります。これはという形で定義されていますが、その中に関数tellとしてがあります。次に、MonadWriterのインスタンス数を定義します。ReaderTIOWriter(duh)などです。したがって、lift.の煩わしい繰り返しを避けることができます。

これは非常に一般的です。モンタージュトランス(MTLの場合)はControl.Monad.***.Classになります。これにはこの種のtypeclassがあります。

+0

私は理解します!、私はMonadsのインスタンスを読んでいませんでした。ありがとうございました – Jcao02

関連する問題