【问题标题】:Are all the lambda argument automatically inlined in F#是否所有 lambda 参数都自动内联在 F# 中
【发布时间】:2011-09-21 11:33:33
【问题描述】:

来自 F# News 的 post 声明 F# 可以内联作为参数传递的函数。 总是这样吗?它会自动发生吗?

【问题讨论】:

    标签: optimization lambda f# inline inlining


    【解决方案1】:

    答案是否定的。如果您有类似以下的函数,则 lambdas 不会内联。 在以下代码中,使用 FSharpFunc<,>.InvokeFast()

    调用 lambdas
    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 功能标记为inline,情况会发生变化。不仅fold 函数被内联,而且 lambdas 也被内联。我使用 .NET Reflector 来确认这一点。

    【讨论】:

      【解决方案2】:

      我不知道编译器对高阶函数做了哪些优化,但是这篇文章似乎指的是明确标记为inline的类型泛化函数。这是为了支持statically resolved type parameters

      【讨论】:

        猜你喜欢
        • 2010-12-04
        • 2018-09-08
        • 1970-01-01
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        相关资源
        最近更新 更多