哈斯克尔。严格申请$!

时间:2009-10-17 12:51:52

标签: optimization haskell lazy-evaluation

我执行下一个代码:

(take 10) $! [1,2..]

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

3 个答案:

答案 0 :(得分:12)

因此,您希望对列表进行全面评估。 ($!)是根据seq实现的,seq“仅”根据文档评估为正常形式。如果值为undefined

,它只会产生影响
Prelude> take 0 undefined
[]
Prelude> take 0 $! undefined
*** Exception: Prelude.undefined

如果

,函数的参数是严格的
f undefined = undefined

这并不意味着该论点是以热切的方式进行全面评估的。你想要的是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> 

来自$!!的{​​{1}}的示例将永远运行。

答案 1 :(得分:4)

强制评估只会确保其参数[1,2..]不是最低点。 [1,2..]匹配(1:_),因此它不是底部,计算将按预期继续,返回[1,2,3,4,5,6,7,8,9,10]

不确定您从哪里获得单1个结果;你会介意复制粘贴GHCi会话的摘录吗?

答案 2 :(得分:2)

你输错了什么?根据GHCi 6.8.2 ......

,无论有没有括号,它都适用于我
GHCi, version 6.8.2: http://www.haskell.org/ghc/  :? for help
($Loading package base ... linking ... done.
Prelude> take 10 $! [1..]
[1,2,3,4,5,6,7,8,9,10]
Prelude> (take 10) $! [1..]
[1,2,3,4,5,6,7,8,9,10]
Prelude> (take 10) $! [1,2..]
[1,2,3,4,5,6,7,8,9,10]