Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 是`\x->⊥;x`equal(在`seq`下)到`⊥;``\x->⊥;`还是什么都没有?_Haskell - Fatal编程技术网

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演算转换的参考(可能我只是错过了它)。如果我们假设在这个例子中可以使用η-转换,我们得到的结果不一致,因此它是不允许的(或者说,我们必须在这种情况下使用它,或者永远不要,我们不能像其他地方那样选择)。