3

F# News 的这篇文章指出 F# 可以内联作为参数传递的函数。总是这样吗?它会自动发生吗?

4

2 回答 2

3

答案是不。如果您有类似以下的函数,则 lambdas 不会内联。在以下代码中,使用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功能标记为inline情况变化。不仅fold函数被内联,而且 lambdas 也被内联。我使用 .NET Reflector 来确认这一点。

于 2012-05-04T16:21:51.197 回答
2

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

于 2011-06-23T19:02:04.543 回答