2011-06-23 7 views
3

に自動的にインライン化されていますか?この#postはF#ニュースから、F#が引数として渡された関数をインライン化できることを示しています。 いつもそうですか?それは自動的に起こるか?すべてのlambda引数はF#

答えて

3

答えはいいえです。次のような関数がある場合、ラムダはインライン化されません。次のコードラムダで はFSharpFunc<,>.InvokeFast()

let fold f s l = 
    let rec loop acc l = 
     match l with []->acc |h::t->loop (f acc h) t 
    loop s l 

let list = [1;2;3;4] 

list|>fold (fun acc x->x+acc) 0|>printfn "%d" 
list|>fold (fun acc x->x*acc) 1|>printfn "%d" 

を使用して呼び出されます。しかし、あなたはinline、状況の変化に応じてfold機能をマークしている場合。 fold関数はインライン展開されるだけでなく、ラムダもインライン展開されます。 .NET Reflectorを使用して確認しました。

2

コンパイラが高次関数に対してどのような最適化を行うのか分かりませんが、この記事は明示的にinlineとマークされた型一般化関数を参照しているようです。これはstatically resolved type parametersをサポートするためです。

関連する問題