我试图更好地理解seq
对->
类型的值的影响/含义,或者更确切地说WHNF对->
-values的含义。
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 -> g x)
是一个闭包,在对其进行评估之前,无法对其进行评估。另一种评估顺序:
seq f ()
seq (\x -> g x) ()
seq (\x -> ⊥) ()
()
仍然给出相同的结果。
关于haskell - `\x -> ⊥ x`是等于 `seq`, `⊥`还是根本不等于(在 `\x -> ⊥`下)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7372120/