Optimization 哈斯克尔。严格应用$!

Optimization 哈斯克尔。严格应用$!,optimization,haskell,lazy-evaluation,Optimization,Haskell,Lazy Evaluation,我执行下一个代码: (take 10) $! [1,2..] 这是什么?我认为,ghc将产生终止,因为我说“评估[1,2..]力”。但是我得到了结果“[1,2,3,4,5,6,7,8,9,10]” 你打错什么了吗?在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,2..]

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

你打错什么了吗?在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]

强制求值只会确保其参数
[1,2..]
不是底部
[1,2..]
匹配
(1:)
,因此它不是底部,计算将按预期进行,返回
[1,2,3,4,5,6,7,8,9,10]


不确定你是从哪里得到这一个
1
结果的;您介意复制粘贴GHCi会议的摘录吗?

因此您希望对列表进行全面评估。($!)是按照
seq
实现的,
seq
“only”根据文档计算为head范式。只有当值
未定义时,它才会起作用:

Prelude> take 0 undefined
[]
Prelude> take 0 $! undefined
*** Exception: Prelude.undefined
函数的参数是严格的,如果

f undefined = undefined
这并不意味着该论点以一种急切的方式得到了充分的评价。你想要的是这样的东西


您的示例与
$来自
DeepSeq
将永远运行。

我的GHC将给我与您的GHC相同的结果。但这不是我满意的结果。我想给你一个机会。当与具有多个参数的curried函数一起使用时,可以使用strict application强制对参数的任何组合进行顶级计算。例如,如果f是一个具有两个参数的curried函数,则可以修改形式为fxy的应用程序,使其具有三种不同的行为:(f$!x)y强制对x(fx)$进行顶级计算!y强制对y(f$!x)$进行顶级评估!y强制对x和y进行顶级评估幸运的是,新用户不会发布图像。当然,对于两行文本,您可以将它们复制为文本;)根据你的形象,你得到了你应该得到的[1,2,3,4,5,6,7,8,9,10]。你为什么说结果是“1”?对不起。最初我想打印另一个例子。你能给我这个文件吗?)我只是指“seq::a->b->b”的文档,它说“将其第一个参数计算为head normal form,然后返回其第二个参数作为结果。”
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>