2016-04-24 8 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'は、STGマシンに部分的に適用されるコンストラクタがないので、コンパイラによって' \a b - > Foo n a b 'に変換されます。 – augustss

+0

@augustss、 'Foo'は実際のコンストラクタを呼び出す厳密な*関数*に変換されています。シンプル化とSTGの間でさらなるアンボックス化は起こりますか? – dfeuer

+0

私が意味したのは、部分的に適用されたコンストラクタが関数に変換されたということでした。次に、厳格なコンストラクタのための別のレベルの変換があります。 – augustss

答えて

3

私はこのためにGHC Trac ticket 12990を開いた。 Reid BartonとSimon Peyton Jonesは、私がGHC Phabricator differential D2891として提出した修正(部分的に適用したときにラッパー関数をインライン化できるようにする)を提案しました。パッチはマスターブランチに適用され、GHC 8.2に含まれます。

関連する問題