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

kni*_*ick 16 haskell lazy-evaluation

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

Prelude> take 10 $! repeat 1
[1,1,1,1,1,1,1,1,1,1]
Run Code Online (Sandbox Code Playgroud)

我期待ghc永远磨掉,试图评估1的无限列表.

fjh*_*fjh 26

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

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

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

?: import Control.DeepSeq (($!!))
?: take 10 $!! repeat 1
^C
Run Code Online (Sandbox Code Playgroud)