Monad变形金刚和升力功能

Jca*_*o02 6 haskell monad-transformers

为什么没有必要使用电梯在内部monad变压器环境中执行功能,IO除外?我的意思是,如果我在WritT上有StateT而在WritT上有WriterT,为什么我能这样做呢?

tell $ {- any code here for the Writer -}
foo <- asks {- This for the reader -}
and so on...
Run Code Online (Sandbox Code Playgroud)

代替

lift $ tell $ {- code ... -}
...
Run Code Online (Sandbox Code Playgroud)

有没有特别的解释,或者只是Monad变形金刚的写作方式?

Dan*_*zer 7

这是因为Monad Transformer Library(MTL)认识到,以这种方式堆叠monad是很常见的,因此它们不会定义tell为某个函数(Mondoid w) => w -> Writer ().

相反,他们将MonadWriter其定义为类型类,并将tell作为函数.然后,他们定义了一吨的实例MonadWriter:ReaderT,IO,Writer(杜)等,并由此可以避免恼人的重复lift..

这很常见,任何monad变换器(在MTL中)将Control.Monad.***.Class具有这种类型类型.