Vic*_*sov 10 monads haskell monad-transformers
是否有必要访问monad的内部结构来编写monad变换器?
例如:我想从Data.Binary.Get中GetT获取Getmonad的变换器,但是这个模块不会暴露Getmonad的内部.这是否意味着我唯一的方法是GetT直接添加到Data.Binary.Get模块?
Joa*_*ner 11
一般来说,是的.在这个例子中看到内部monad(这里是list monad)如何"撤消"外部monad的"早期"动作的效果:
> execWriterT (tell "Hi" >> tell "Ho" >> lift [()])
["HiHo"]
> execWriterT (tell "Hi" >> tell "Ho" >> lift [])
[]
Run Code Online (Sandbox Code Playgroud)
现在假设您可以将每个monad变成monad变换器.然后你就可以构建一个IOTmonad变换器,这可能会发射导弹然后撤消它:
> execIOT (launchMissile >> lift [])
Run Code Online (Sandbox Code Playgroud)
因此,不可能在没有看到定义的情况下将任意单子变成单子变换器.