我执行下一个代码:
(take 10) $! [1,2..]
它是什么 ?我想,ghc 会终止,因为我说“评估 [1,2..] 力”。但我得到了结果“[1,2,3,4,5,6,7,8,9,10]”。
我执行下一个代码:
(take 10) $! [1,2..]
它是什么 ?我想,ghc 会终止,因为我说“评估 [1,2..] 力”。但我得到了结果“[1,2,3,4,5,6,7,8,9,10]”。
因此,您希望对列表进行全面评估。($!) 是根据文档实现的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>
您的示例$!!
fromDeepSeq
永远运行。
强制评估只会确保它的论点[1,2..]
不是底部。 [1,2..]
匹配(1:_)
,所以它不是底部,并且计算将按预期进行,返回[1,2,3,4,5,6,7,8,9,10]
.
不知道你从哪里得到那个单一1
的结果;您介意复制粘贴 GHCi 会话的摘录吗?
你是不是打错字了?在 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]