`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?
抱歉,我不确定优化。
给出
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?
抱歉,我不确定优化。