3

F# News のこの投稿では、F# は引数として渡された関数をインライン化できると述べています。いつもそうですか?それは自動的に起こりますか?

4

2 に答える 2

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"

しかし、状況が変わるfoldと機能をマークすると。関数がインライン化されるだけでなく、ラムダもインライン化されますinlinefold.NET Reflector を使用して確認しました。

于 2012-05-04T16:21:51.197 に答える
2

コンパイラが高階関数に対してどのような最適化を行っているかはわかりませんが、この記事では明示的にinline. これは、静的に解決された型パラメーターをサポートするためのものです。

于 2011-06-23T19:02:04.543 に答える