编写单子变换器是否需要访问单子的内部结构?
例如:我想为来自Data.Binary.Get的Get单子创建GetT变换器,但是该模块不公开Get单子的内部结构。这是否意味着我唯一的选择是直接将GetT添加到Data.Binary.Get模块中?
编写单子变换器是否需要访问单子的内部结构?
例如:我想为来自Data.Binary.Get的Get单子创建GetT变换器,但是该模块不公开Get单子的内部结构。这是否意味着我唯一的选择是直接将GetT添加到Data.Binary.Get模块中?
通常情况下,是的。看这个例子,内部单子(在这里是列表单子)如何“取消”外部单子“先前”的操作:
> execWriterT (tell "Hi" >> tell "Ho" >> lift [()])
["HiHo"]
> execWriterT (tell "Hi" >> tell "Ho" >> lift [])
[]
假设您可以将每个单子转换为单子变换器。那么您将能够构建一个IOT
单子变换器,此代码将发射导弹,但然后撤销它:
> execIOT (launchMissile >> lift [])
因此,如果不查看定义,就无法将任意单子转换为单子变换器。execIOT (launchMissile >> lift [])
需要先发射一枚导弹,然后再“撤销”它呢?我本来以为表达式 launchMissile >> lift []
只是一个 IOT []
值,不会 发射任何导弹,所以当执行它时,execIOT
不需要做任何事情。 - winitzki