Haskell 是`\x->⊥;x`equal(在`seq`下)到`⊥;``\x->⊥;`还是什么都没有?
我试图更好地理解Haskell 是`\x->⊥;x`equal(在`seq`下)到`⊥;``\x->⊥;`还是什么都没有?,haskell,Haskell,我试图更好地理解seq对->-类型值的影响/意义,或者更确切地说,WHNF对->-值的含义 Haskell报告将seq定义为 seq ⊥ b = ⊥ seq a b = b, if a ≠ ⊥ 报告还指出,由于上述定义 ⊥ is not the same as \x -> ⊥, since seq can be used to distinguish them 如果我有以下定义 f, g :: () -> () g = ⊥ f = \x -> g x 那么f在语
seq
对->
-类型值的影响/意义,或者更确切地说,WHNF对->
-值的含义
Haskell报告将seq
定义为
seq ⊥ b = ⊥
seq a b = b, if a ≠ ⊥
报告还指出,由于上述定义
⊥ is not the same as \x -> ⊥, since seq can be used to distinguish them
如果我有以下定义
f, g :: () -> ()
g = ⊥
f = \x -> g x
那么f
在语法上应该等同于g
(不是吗?),但是表达式应该是什么呢
seq f ()
seq g ()
根据Haskell报告,根据给出的规则进行评估:
seq f ()
seq (\x -> g x) ()
()
seq g ()
seq ⊥ ()
⊥
这是因为(\x->gx)
是一个闭包,只有在它有要计算的内容时才能进行计算
备选评估顺序:
seq f ()
seq (\x -> g x) ()
seq (\x -> ⊥) ()
()
仍然给出相同的结果。Re:“那么
f
应该在语法上等同于g
,不是吗?”:不,它们在语法上不等价。事实上,你所做的被称为η-扩展(η-归约的反面),在设计语言时决定是否包含η-归约是一个有点深的语义问题,有一些令人惊讶和深刻的后果。@Daniel Wagner:Btw,Haskell报告实际上在哪里说明η-转换是否可用于减少表达式?我不相信Haskell在任何地方都有正式的语义。(惊讶!)这不是一种状态吗(或者是我的老师这么说的),你可以选择任何你想要的降价方案,只要它是一致的。但它们几乎是不同的语言。这与几个月前我问的一个问题非常相似:根据Haskell报告,\x->gx
不能被计算为等于⊥代码>就seq
而言?我找不到任何允许lambda演算转换的参考(可能我只是错过了它)。如果我们假设在这个例子中可以使用η-转换,我们得到的结果不一致,因此它是不允许的(或者说,我们必须在这种情况下使用它,或者永远不要,我们不能像其他地方那样选择)。