GHCのドキュメントによると:
... GHC は、関数が完全に適用されている場合にのみ関数をインライン化します。ここで、「完全に適用された」とは、関数定義の LHS に (構文的に) 表示されるのと同じ数の引数に適用されることを意味します。
与えられた例は、意味的に同等の 2 つの定義です。
comp1 :: (b -> c) -> (a -> b) -> a -> c
{-# INLINE comp1 #-}
comp1 f g = \x -> f (g x)
comp2 :: (b -> c) -> (a -> b) -> a -> c
{-# INLINE comp2 #-}
comp2 f g x = f (g x)
私の質問:
この厳密な動作 (つまり、LHS の厳密な構文ビュー、最適化なしでインライン化された RHS) が得られるのは、INLINE プラグマが存在する場合のみですか?
comp2
INLINE プラグマが指定されていない場合、GHC は関数を のように変換しcomp1
ますか?そうでない場合、なぜですか?一般に、コンパイラが関数のセマンティクスを調べて、部分的に適用する INLINE の量と場所を決定するのは難しすぎますか?
let... in
GHC がすべての関数をラムダ式の式のカスケードに変換し、LHS に束縛がない場合はどうなるでしょうか?