6

为什么除了 IO 之外,在内部 monad 转换器环境中不需要使用 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 的编写方式?

4

1 回答 1

7

这是因为 Monad Transformer Library (MTL) 认识到以这种方式堆叠 monad 是很常见的,因此它们不会被定义tell为只是一些 function (Mondoid w) => w -> Writer ()

相反,它们将MonadWriter其定义为类型类,其中包含 tell 作为函数MonadWriter然后他们定义了大量的: ReaderT, IO, (duh) 等实例Writer。这样你就可以避免烦人的lift..

这很常见,任何 monad 转换器(在 MTL 中)都会有一个Control.Monad.***.Class具有这种类型类的。

于 2013-06-20T03:05:57.160 回答