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