部分应用严格的构造函数

dfe*_*uer 16 performance haskell

假设我有

data Foo a = Foo !Int a [a] | Bar [a]
Run Code Online (Sandbox Code Playgroud)

所以Foo构造函数的第一个参数是严格的,将被解压缩.进一步假设我正在传递Foo n给更高阶的函数f并且f没有内联(因此Foo n实际上已经传递).我得到的核心-O2表示n被盒装然后传递给Foo,结果传递给f.我的问题:我打电话会更好吗?

f (\a b -> Foo n a b)
Run Code Online (Sandbox Code Playgroud)

避免拳击n?或者会导致其他一些性能问题?


我其实是想要定义

foo' !n = \a b -> Foo n a b
Run Code Online (Sandbox Code Playgroud)

并打电话f (foo' n),我认为应该做同样的事情,但我想最好特别问一下.

dfe*_*uer 3

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