为什么在内部monad transformer环境中,除了IO之外,不需要使用lift来执行函数?我的意思是,如果我在WriterT上使用StateT,在ReaderT上使用WriterT,为什么我可以这样做呢?
tell $ {- any code here for the Writer -}
foo <- asks {- This for the reader -}
and so on...而不是
lift $ tell $ {- code ... -}
...有什么特别的解释吗?或者这只是Monad Transformers的编写方式?
发布于 2013-06-20 11:05:57
这是因为Monad Transformer Library认识到,以这种方式堆叠Monad是很常见的,因此它们不会将tell定义为某个函数(Mondoid w) => w -> Writer ()。
取而代之的是MonadWriter,它被定义为一个带有tell函数的类型类。然后他们定义了一大堆MonadWriter的实例:ReaderT、IO、Writer (duh)等等,这样就避免了lift.令人讨厌的重复。
这是很常见的,任何monad transformer (在MTL中)都会有一个具有这种类型类的Control.Monad.***.Class。
https://stackoverflow.com/questions/17204573
复制相似问题