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变形金刚的写作方式?
这是因为Monad Transformer Library(MTL)认识到,以这种方式堆叠monad是很常见的,因此它们不会定义tell为某个函数(Mondoid w) => w -> Writer ().
相反,他们将MonadWriter其定义为类型类,并将tell作为函数.然后,他们定义了一吨的实例MonadWriter:ReaderT,IO,Writer(杜)等,并由此可以避免恼人的重复lift..
这很常见,任何monad变换器(在MTL中)将Control.Monad.***.Class具有这种类型类型.