哈斯克尔$!运算符和无限列表

时间:2014-05-12 14:22:30

标签: haskell lazy-evaluation

我看了$!操作员强制严格评估。那么为什么这仍然有用?

Prelude> take 10 $! repeat 1
[1,1,1,1,1,1,1,1,1,1]

我期待ghc永远地试图评估1的无限列表。

1 个答案:

答案 0 :(得分:26)

$!强制其第二个参数为弱头正常形式,这基本上意味着它评估其参数的最外层构造函数。因此,在您的情况下,它不会强制评估整个列表,而只会评估最外层(即第一个):构造函数。

Haskell: What is Weak Head Normal Form?对WHNF的正常形式有一个很好的解释。

请注意,如果您强制评估整个列表(例如,使用$!!模块中的Control.DeepSeq运算符),您的程序将不会终止:

λ: import Control.DeepSeq (($!!))
λ: take 10 $!! repeat 1
^C