假设我有
data Foo a = Foo !Int a [a] | Bar [a]
所以
Foo
构造函数的第一个参数是严格的,它将被解包。进一步假设我正在传递 Foo n
到高阶函数 f
那f
不会被内联(所以 Foo n
实际上是通过了)。我通过 -O2
获得的核心表示n
被装箱,然后传递给 Foo
,并将结果传递给 f
.我的问题:调用我会更好吗f (\a b -> Foo n a b)
避免拳击
n
?还是会导致其他一些性能问题?我实际上是在想定义
foo' !n = \a b -> Foo n a b
并调用
f (foo' n)
,我认为应该做同样的事情,但我想最好具体问一下。
最佳答案
我打开了GHC Trac ticket 12990为了这。 Reid Barton 和 Simon Peyton Jones 提出了一个修复(允许在部分应用时内联包装函数),我将其提交为 GHC Phabricator differential D2891 .该补丁已应用于 master 分支,并将包含在 GHC 8.2 中。
关于performance - 严格构造函数的部分应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36818270/