假设我有
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)
,我认为应该做同样的事情,但我想最好特别提问。
答案 0 :(得分:3)
我为此打开了GHC Trac ticket 12990。 Reid Barton和Simon Peyton Jones建议修复(允许在部分应用时内联包装函数),我将其作为GHC Phabricator differential D2891提交。该补丁已应用于主分支,将包含在GHC 8.2中。