16
假设部分应用程序,我有严格的构造
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)
,我想通应该做同样的事情,但我想这是更好的明确要求。
据我所知,编译器将'Foo n'转换为'\ a b - > Foo n a b',因为在STG机器中没有部分应用的构造函数。 – augustss
@augustss,'Foo'被转换为一个严格的*函数*,它调用真实的构造函数,据我所知。简化和STG之间会发生进一步拆箱吗? – dfeuer
我的意思是,部分应用的构造函数被转换为函数。然后严格的构造函数还有另一个级别的翻译。 – augustss