6

IO を除いて、内部モナド変換環境で関数を実行するためにリフトを使用する必要がないのはなぜですか? つまり、StateT が WriterT であり、WriterT が ReaderT である場合、なぜこれを行うことができるのでしょうか?

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

それ以外の

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

特別な説明はありますか、それともモナドトランスフォーマーが書かれた方法だけですか?

4

1 に答える 1

7

tellこれは、Monad Transformer Library (MTL) が、モナドを単なる関数として定義しないように、そのようにスタックすることが非常に一般的であることを認識しているためです(Mondoid w) => w -> Writer ()

代わりに、関数として tell を持つ typeclassMonadWriterとして定義されている which があります。次に、 : 、、(duh) などの大量のインスタンスを定義します。したがって、 .MonadWriterReaderTIOWriterlift.

これは非常に一般的で、(MTL の) モナド変換子には、Control.Monad.***.Classこの種の型クラスを持つ があります。

于 2013-06-20T03:05:57.160 に答える