haskell - Monad 变压器和提升功能

标签 haskell monad-transformers

除了 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 实例:ReaderTIOWriter(废话)等等。您可以避免烦人的重复lift.

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

关于haskell - Monad 变压器和提升功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204573/

相关文章:

haskell - 在GHC RTS的调度程序中,为什么要将功能标记为免费?

haskell - 在 Haskell WAI 中,如何将 header 添加为中间件?

haskell - 是否有任何语言扩展或 Haskell 的语言后代,有利于表现力,特别是在实例处理方面?

haskell - 在 Haskell 中合并/追加 Justs

haskell - 在 Haskell 中减少单子(monad)

haskell - 为什么单子(monad)转换器与堆叠单子(monad)不同?

api - 变压器是否有类型签名?

Haskell:更好地理解代数数据类型

scala - monad 转换器是否适用于从服务获取 JSON?

haskell - 定义自制 monad 变压器的绑定(bind)