Optimization 是否所有lambda参数都自动内联到F中#

Optimization 是否所有lambda参数都自动内联到F中#,optimization,lambda,f#,inline,inlining,Optimization,Lambda,F#,Inline,Inlining,来自F#News的这条消息指出,F#可以内联作为参数传递的函数。 总是这样吗?它是自动发生的吗?我不知道编译器对高阶函数做了哪些优化,但本文似乎是指显式标记为inline的类型通用函数。这是为了支持 答案是否定的。如果有如下函数,lambda不会内联。 在以下代码中,使用FSharpFunc.InvokeFast()调用lambda 但如果您将折叠功能标记为内联情况会发生变化。不仅fold函数内联,lambda也内联。我用.NETReflector来证实这一点 let fold f s l =

来自F#News的这条消息指出,F#可以内联作为参数传递的函数。
总是这样吗?它是自动发生的吗?

我不知道编译器对高阶函数做了哪些优化,但本文似乎是指显式标记为
inline
的类型通用函数。这是为了支持

答案是否定的。如果有如下函数,lambda不会内联。 在以下代码中,使用
FSharpFunc.InvokeFast()调用lambda

但如果您将
折叠
功能标记为
内联
情况会发生变化。不仅
fold
函数内联,lambda也内联。我用.NETReflector来证实这一点

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"