【发布时间】:2019-01-26 14:23:27
【问题描述】:
似乎有一些关于Monad IO 和IO 之间区别的无证知识。备注here 和here) 暗示IO a 可以用于否定位置但可能会产生意想不到的后果:
引用斯诺伊曼1:
但是,我们知道一些控制流(例如异常处理) 没有被使用,因为它们与 MonadIO 不兼容。 (原因:MonadIO 要求 IO 是正数,不是负数, 位置。)这让我们知道,例如, foo 在 一个基于延续的单子,如 ContT 或 Conduit。
还有凯米特2:
我倾向于导出带有 MonadIO 约束的函数...无论何时 不必在负面位置采取类似 IO 的动作(作为 论据)。
当我的代码确实必须将另一个单子动作作为参数时, 然后我通常不得不停下来考虑一下。
程序员应该知道的这些功能是否存在危险?
这是否意味着运行任意基于延续的操作可能会重新定义控制流,从而以基于Monad IO 的接口安全的方式给出意想不到的结果?
【问题讨论】:
-
没有危险。就是做不到。 Possible duplicate.
-
什么不能做?
IO a处于负面位置?我可能会错误地措辞这个问题。我赞成这个答案,因为它对我有所帮助,但我无法理解。 -
不,将具有在否定位置提及
IO的类型的术语概括为适用于任何MonadIO实例的类型是无法做到的。 -
但我不想一概而论。我想保持
IO a处于负面地位,我在问为什么它似乎不受欢迎。 -
对此没什么气馁的。你误解了评论。