我试图更好地理解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/

10-11 02:57
查看更多