是否有必要访问 monad 的内部结构来编写 monad 转换器?
例如:我想拥有来自 Data.Binary.GetGetT
的 monad 转换Get
器,但是这个模块不会暴露Get
monad 的内部结构。这是否意味着我唯一的方法是GetT
直接添加到 Data.Binary.Get 模块?
是否有必要访问 monad 的内部结构来编写 monad 转换器?
例如:我想拥有来自 Data.Binary.GetGetT
的 monad 转换Get
器,但是这个模块不会暴露Get
monad 的内部结构。这是否意味着我唯一的方法是GetT
直接添加到 Data.Binary.Get 模块?
一般来说,是的。在这个例子中看看内部 monad(这里是 list monad)如何“撤销”外部 monad 的“早期”动作的效果:
> execWriterT (tell "Hi" >> tell "Ho" >> lift [()])
["HiHo"]
> execWriterT (tell "Hi" >> tell "Ho" >> lift [])
[]
现在假设您可以将每个 monad 变成一个 monad 转换器。然后你就可以构建一个IOT
单子变压器,这可以发射导弹但随后撤消它:
> execIOT (launchMissile >> lift [])
因此,在不查看定义的情况下,不可能将任意 monad 转换为 monad 转换器。