2016-04-24 90 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

回答