【发布时间】:2017-05-22 04:58:32
【问题描述】:
IO,就像Maybe,只是Monad 的一个实例。另一方面,我们拥有Maybe(Just 和Nothing)的所有数据构造函数,但没有IO 的构造函数。 Reader 和 Writer 也不导出构造函数,它们具有返回此类型实例的函数(reader 和 writer),更重要的是 runReader 和 runWriter,它们从 Monad 解包计算结果。
有没有办法解开 IO Monad?我想有一个纯函数,它在引擎盖下做一些不纯的 IO 计算。目前我可以用大多数 Monads 做到这一点
我知道这种棘手功能的一个例子:Debug.Trace.trace
【问题讨论】:
-
本地不纯操作可以使用
ST。 -
这正是 IO monad 试图阻止的。所有不纯的效果都归入 IO 内部。你到底为什么要打破它?
-
这绝对不意味着您可以打开某些东西,因为它是
Monad。考虑data Proxy a = Proxy(请注意,根本没有“包含在”Proxy中的值)这是一个Monad。 -
你不能按设计解开
IO,因为它的目的是标记必须由编译器实现的操作,而不是在Haskell代码中。 -
说
ST是他要找的东西太仓促了。虽然它是解决许多问题的好方法,但他还没有说明需要,他的一个例子是trace- 当然不是ST之类的任务。 @yanpas 您能否更具体地说明您的实际目标?