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'は、STGマシンに部分的に適用されるコンストラクタがないので、コンパイラによって' \a b - > Foo n a b 'に変換されます。 – augustss
@augustss、 'Foo'は実際のコンストラクタを呼び出す厳密な*関数*に変換されています。シンプル化とSTGの間でさらなるアンボックス化は起こりますか? – dfeuer
私が意味したのは、部分的に適用されたコンストラクタが関数に変換されたということでした。次に、厳格なコンストラクタのための別のレベルの変換があります。 – augustss