【发布时间】:2011-09-21 11:33:33
【问题描述】:
来自 F# News 的 post 声明 F# 可以内联作为参数传递的函数。 总是这样吗?它会自动发生吗?
【问题讨论】:
标签: optimization lambda f# inline inlining
来自 F# News 的 post 声明 F# 可以内联作为参数传递的函数。 总是这样吗?它会自动发生吗?
【问题讨论】:
标签: optimization lambda f# inline inlining
答案是否定的。如果您有类似以下的函数,则 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 来确认这一点。
【讨论】:
我不知道编译器对高阶函数做了哪些优化,但是这篇文章似乎指的是明确标记为inline的类型泛化函数。这是为了支持statically resolved type parameters。
【讨论】: