Haskell $! 运算符和无限列表

我读过$! 运营商力量严格评估。 那么为什么这仍然有效?

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

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


$! 强制它的第二个参数是弱头标准形式,这基本上意味着它评估它的参数的最外层构造函数。 所以在你的情况下,它不会强制整个列表的评估,但只评估最外层(即第一个) :构造函数。

Haskell对WHNF的正常形式有一个很好的解释:什么是弱头标准形式? 。

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

λ: import Control.DeepSeq (($!!))
λ: take 10 $!! repeat 1
^C
链接地址: http://www.djcxy.com/p/42971.html

上一篇: Haskell $! operator and infinite lists

下一篇: How to force evaluation in Haskell?