假设我有
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)
,我认为它应该做同样的事情,但我想更好的方法是明确地询问。
发布于 2017-01-03 01:14:26
我为此打开了GHC Trac ticket 12990。Reid Barton和Simon Peyton Jones提出了一个修复方案(允许包装器函数在部分应用时内联),我将其作为GHC Phabricator differential D2891提交。该修补程序已应用于主分支,并将包含在GHC 8.2中。
https://stackoverflow.com/questions/36818270
复制相似问题