Performance 严格构造函数的局部应用

Performance 严格构造函数的局部应用,performance,haskell,Performance,Haskell,如果我有 data Foo a = Foo !Int a [a] | Bar [a] 因此,Foo构造函数的第一个参数是严格的,它将被解包。进一步假设我将foon传递给一个高阶函数f,并且f没有内联(因此foon实际上被传递)。我用-O2得到的核心表示n被装箱,然后传递给Foo,结果传递给f。我的问题是:我打电话会更好吗 f (\a b -> Foo n a b) 要避免装箱n?还是会导致其他性能问题 我实际上在想如何定义 foo' !n = \a b -> Foo n a b

如果我有

data Foo a = Foo !Int a [a] | Bar [a]
因此,
Foo
构造函数的第一个参数是严格的,它将被解包。进一步假设我将
foon
传递给一个高阶函数
f
,并且
f
没有内联(因此
foon
实际上被传递)。我用
-O2
得到的核心表示
n
被装箱,然后传递给
Foo
,结果传递给
f
。我的问题是:我打电话会更好吗

f (\a b -> Foo n a b)
要避免装箱
n
?还是会导致其他性能问题


我实际上在想如何定义

foo' !n = \a b -> Foo n a b

打电话给
f(foo'n)
,我觉得应该做同样的事情,但我想最好是具体问一下。

我是为此打开的。Reid Barton和Simon Peyton Jones提出了一个修复方案(允许在部分应用时内联包装器函数),我将其提交为。修补程序已应用于主分支,并将包含在GHC 8.2中。

据我所知,编译器将
foon
转换为
\a b->foon a b
,因为STG机器中没有部分应用的构造函数。@augustss,据我所知,
Foo
被转换为一个调用真正构造函数的严格函数。简化和STG之间是否会发生进一步的拆箱?我的意思是,部分应用的构造函数将被转换为函数。然后是严格构造函数的另一个翻译级别。