【发布时间】:2014-05-12 14:22:29
【问题描述】:
我读到 $!操作员强制进行严格的评估。那么为什么这仍然有效?
Prelude> take 10 $! repeat 1
[1,1,1,1,1,1,1,1,1,1]
我期待 ghc 永远努力评估无限的 1 列表。
【问题讨论】:
我读到 $!操作员强制进行严格的评估。那么为什么这仍然有效?
Prelude> take 10 $! repeat 1
[1,1,1,1,1,1,1,1,1,1]
我期待 ghc 永远努力评估无限的 1 列表。
【问题讨论】:
$! 将其第二个参数强制为弱头范式,这基本上意味着它评估其参数的最外层构造函数。因此,在您的情况下,它不会强制评估整个列表,而只会评估最外层(即第一个): 构造函数。
Haskell: What is Weak Head Normal Form? 对范式与 WHNF 有很好的解释。
请注意,如果您强制评估整个列表(例如,使用 Control.DeepSeq 模块中的 $!! 运算符),您的程序将不会终止:
λ: import Control.DeepSeq (($!!))
λ: take 10 $!! repeat 1
^C
【讨论】:
take n,对于n > 0,无论如何都必须将列表强制为WHNF,因此take 10 $! repeat 1在操作上与take 10 $ repeat 1相同。