部分应用严格的构造函数

时间:2016-04-24 01:21:51

标签: performance haskell

假设我有

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),我认为应该做同样的事情,但我想最好特别提问。

1 个答案:

答案 0 :(得分:3)

我为此打开了GHC Trac ticket 12990。 Reid Barton和Simon Peyton Jones建议修复(允许在部分应用时内联包装函数),我将其作为GHC Phabricator differential D2891提交。该补丁已应用于主分支,将包含在GHC 8.2中。