除了 IO 之外,为什么不需要使用 lift 来在内部 monad 变压器环境中执行函数?我的意思是,如果我的 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 的编写方式?
最佳答案
这是因为 Monad Transformer Library (MTL) 认识到以这种方式堆叠 monad 是很常见的,因此它们不会将 tell
定义为某个函数 (Mondoid w ) => w -> Writer()
。
相反,他们有 MonadWriter
它被定义为一个类型类,其中以tell作为函数。然后他们定义了大量的 MonadWriter
实例:ReaderT
、IO
、Writer
(废话)等等。您可以避免烦人的重复lift.
。
这很常见,任何 monad 转换器(在 MTL 中)都会有一个 Control.Monad.***.Class
,它具有这种类型类。
关于haskell - Monad 变压器和提升功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204573/