我试图更好地理解seq
on ->
-typed值的效果/含义,或者更确切地说WHNF对于值的意义->
.
Haskell报告定义seq
为
seq ? b = ?
seq a b = b, if a ? ?
Run Code Online (Sandbox Code Playgroud)
该报告还指出,由于上述定义
? is not the same as \x -> ?, since seq can be used to distinguish them
Run Code Online (Sandbox Code Playgroud)
如果我有以下定义
f, g :: () -> ()
g = ?
f = \x -> g x
Run Code Online (Sandbox Code Playgroud)
然后f
应该在语法上等同于g
(不应该吗?),但表达式应该是什么
seq f ()
seq g ()
Run Code Online (Sandbox Code Playgroud)
根据Haskell报告评估?
根据给出的规则:
\n\nseq f ()\nseq (\\x -> g x) ()\n()\n\nseq g ()\nseq \xe2\x8a\xa5 ()\n\xe2\x8a\xa5\n
Run Code Online (Sandbox Code Playgroud)\n\n这是因为它(\\x -> g x)
是一个闭包,并且在有需要评估的内容之前无法对其进行评估。
另一种评估顺序:
\n\nseq f ()\nseq (\\x -> g x) ()\nseq (\\x -> \xe2\x8a\xa5) ()\n()\n
Run Code Online (Sandbox Code Playgroud)\n\n仍然给出相同的结果。
\n