哈斯克尔.严格申请$!

Ant*_*ton 3 optimization haskell lazy-evaluation

我执行下一个代码:

(take 10) $! [1,2..]
Run Code Online (Sandbox Code Playgroud)

它是什么 ?我想,ghc会产生终止,因为我说"评估[1,2 ..]力".但我得到了结果"[1,2,3,4,5,6,7,8,9,10]".

Rüd*_*nke 12

所以你希望对列表进行全面评估.($!)是根据文档实现的seq,并且seq"仅"评估为正常形式.如果值为undefined:它只会有所不同:

Prelude> take 0 undefined
[]
Prelude> take 0 $! undefined
*** Exception: Prelude.undefined
Run Code Online (Sandbox Code Playgroud)

如果函数的参数是严格的

f undefined = undefined
Run Code Online (Sandbox Code Playgroud)

这并不意味着该论点是以热切的方式进行全面评估的.你想要的是像DeepSeq.

GHCi, version 6.10.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling DeepSeq          ( deepSeq.lhs, interpreted )
Ok, modules loaded: DeepSeq.
*DeepSeq> take 1 $!! [1,2,undefined]
*** Exception: Prelude.undefined
*DeepSeq> 
Run Code Online (Sandbox Code Playgroud)

你的例子$!!来自于DeepSeq永远的奔跑.