`pure x :: IO a` 是纯值还是有副作用的值?

Is `pure x :: IO a` a pure value or one with a side effect?

给出

pure id <*> v = v

持有,可以pure做任何可观察的事情而不违反法律吗?

如果我定义一个封装 IO 的类型并说,生成一个新线程,GHC 是否可以免费优化它?

编辑:我终于意识到这个问题实际上是关于拥有非法 IO 实例的后果...

GHC 对类型 class 法则一无所知(不像 Idris 或 Coq),它们仅作为文档和编程约定存在。因此,实例可以是合法的也可以是非法的,无论哪种情况,GHC 优化都不会改变程序行为。

如果你写一个特定的合法实例,那么你也许可以添加一个REWRITE规则让GHC删除pure id,GHC也可能最终优化pure id特定的 Applicative 仿函数,其中此优化的安全性显而易见。

我必须把你的问题分成两个问题:

Is pure x :: IO a a pure value or one with a side effect?

一个几乎纯粹的价值。在这段代码中,x的类型是a,这是一个纯值。
pure 的类型是 a -> IO a,它用 IO 包装了参数,但实际上没有任何副作用。
所以pure x :: IO a在其类型上看似有副作用,但实际上并没有。

... can pure do anything observable and not break the law?

没有。 pure 只是应用 id 来对抗由 v.
引起的副作用的结果 只要实例遵循Applicative law,导致副作用的不是pure而是v

我猜你在 pure x 中选择了 x 而在 pure id <*> v 中选择了 v :: IO a
前者是一个完全纯值,其类型是 a,而后者不是纯值:一个可能导致副作用的操作返回一个类型是 a.

的值

最后一个问题:

If I define a type that encapsulates IO and say, spawn a new thread, is GHC free to optimize it away?

抱歉,我不确定优化。