Все лямбда-аргументы автоматически вставляются в F # - PullRequest
3 голосов
/ 23 июня 2011

Эта запись из F # News гласит, что F # может встроить функцию, переданную в качестве аргумента.Это всегда так?Это происходит автоматически?

Ответы [ 2 ]

3 голосов
/ 04 мая 2012

Ответ - нет. Если у вас есть функция, подобная следующей, лямбды не вставляются. В следующем коде лямбды вызываются с помощью 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 становится встроенной, но и лямбда-выражения. Я использовал .NET Reflector, чтобы подтвердить это.

2 голосов
/ 23 июня 2011

Я не знаю, какую оптимизацию компилятор выполняет для функций высшего порядка, но эта статья, похоже, относится к обобщенным типам функциям, явно помеченным inline.Это для поддержки статически разрешенных параметров типа .

...