是否可以访问monad变换器所需的monad内部结构?

时间:2012-08-03 08:43:12

标签: haskell monads monad-transformers

是否有必要访问内部结构 monad写monad变压器?

例如:我想从Data.Binary.Get获得GetT - Get monad变换器, 但是这个模块没有暴露Get monad的内部。这是唯一的意思吗? 对我来说,方法是将GetT直接添加到Data.Binary.Get模块?

1 个答案:

答案 0 :(得分:11)

总的来说,是的。在这个例子中看到内部monad(这里是list monad)如何“撤消”外部monad的“早期”动作的效果:

> execWriterT (tell "Hi" >> tell "Ho" >> lift [()])
["HiHo"]
> execWriterT (tell "Hi" >> tell "Ho" >> lift [])
[]

现在假设您可以将每个monad变成monad变换器。然后你就可以构造一个IOT monad变换器,这可能会发射导弹然后撤消它:

> execIOT (launchMissile >> lift [])

因此,如果不将定义转换为monad变换器,就不可能将任意monad变为。