“ pure x :: IO a”是纯值还是具有副作用的值?

sev*_*evo 3 haskell side-effects

给定

pure id <*> v = v
Run Code Online (Sandbox Code Playgroud)

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

如果我定义一个封装类型IO并说产生一个新线程,那么GHC可以自由地优化它吗?

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

And*_*ács 5

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

如果您编写了一个特定的合法实例,则可以添加一条REWRITE规则来删除pure idGHC,并且GHC可能最终还会pure id在特定Applicative函子上进行优化,而这种优化的安全性显而易见。