2016-04-24 60 views
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),我想通应该做同样的事情,但我想这是更好的明确要求。

+2

据我所知,编译器将'Foo n'转换为'\ a b - > Foo n a b',因为在STG机器中没有部分应用的构造函数。 – augustss

+0

@augustss,'Foo'被转换为一个严格的*函数*,它调用真实的构造函数,据我所知。简化和STG之间会发生进一步拆箱吗? – dfeuer

+0

我的意思是,部分应用的构造函数被转换为函数。然后严格的构造函数还有另一个级别的翻译。 – augustss

回答