关于评估,Haskell是否有可耻的变化?

Dav*_*vid 3 haskell lazy-evaluation seq

在研究并行编程和随后的评估策略时,出现了thunk是否可变的问题.举个例子,假设我有以下代码:

foo = 1 + 2         -- Thunk
bar = foo `seq` foo -- Evaluates foo
Run Code Online (Sandbox Code Playgroud)

seq在评估bar评估时调用foo,给出bar正常的表单值3.此评估是否foo也会影响?也就是说,评估之后是foo静止的1+2还是3bar

Tik*_*vis 8

Haskell报告仅指定评估顺序为"非严格",因此任一行为都符合标准.

但是,使用lazy("按需调用")评估,其中涉及以一种使得thunk"如你所描述的那样"可变"的方式共享值,提供了对"按名称调用"(即不分享)的渐近改进.

因此,在GHC(以及可能是大多数其他合理的实现)中,foo3在您第一次强制它之后成为.但是,标准并未规定这一点,您应该牢记这一点.