单子变换器和lift函数

6
为什么在内部单子变换器环境中执行函数时,除了IO外不需要使用lift?我的意思是,如果我有StateT覆盖WriterT和WriterT覆盖ReaderT,为什么可以这样做?
tell $ {- any code here for the Writer -}
foo <- asks {- This for the reader -}
and so on...

替代

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

是否有特殊的解释,还是只是 Monad Transformers 的书写方式?


3
请查看所有WriterT示例 - icktoofay
1
请注意,如果您使用的是transformers库而不是mtl,则必须明确地将所有内容lift - Gabriella Gonzalez
1个回答

7
因为Monad变换器库(MTL)认识到在这种情况下堆叠单子很常见,所以它们不将tell定义为仅仅是一个函数(Mondoid w)=>w->Writer()。相反,他们有MonadWriter,它被定义为一个带有tell函数的类型类。然后他们定义了大量MonadWriter实例:如ReaderTIOWriter等。这样就避免了繁琐的lift重复使用。这是非常普遍的,MTL中的任何单子变换器都会有一个Control.Monad.***.Class,其中包含此类类型类。

我明白了!我没有阅读单子的实例。谢谢。 - Jcao02

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接