Вы должны использовать inline, когда вам нужно определить функцию, для которой ее тип (пере) должен оцениваться на сайте каждого использования, в отличие от обычной функции, у которой ее тип будет оцениваться (выводиться) только на сайте.первого использования, а затем считаются статически типизированными с этой первой предполагаемой сигнатурой типа везде и после этого.
В встроенном случае определение функции является по сути универсальным / полиморфным, тогда как в обычном (не встроенном)) в этом случае функция статически (и часто неявно) типизирована.
Итак, если вы используете inline, следующий код:
let inline add a b = a + b
[<EntryPoint>]
let main args =
let one = 1
let two = 2
let three = add one two
// here add has been compiled to take 2 ints and return an int
let dog = "dog"
let cat = "cat"
let dogcat = add dog cat
// here add has been compiled to take 2 strings and return a string
printfn "%i" three
printfn "%s" dogcat
0
будет скомпилирован и скомпилирован для получения следующего вывода:
3
dogcat
Другими словами, одно и то же определение функции добавления использовалось для создания как функции, которая добавляет к целым числам, так и функции, которая объединяет две строки (фактически, перегрузка базового оператора на + такжедостигается под капотом с помощью встроенного).
В то время как этот код, идентичный, за исключениемчто функция добавления больше не объявляется как встроенная:
let add a b = a + b
[<EntryPoint>]
let main args =
let one = 1
let two = 2
let three = add one two
// here add has been compiled to take 2 ints and return an int
let dog = "dog"
let cat = "cat"
let dogcat = add dog cat
// since add was not declared inline, it cannot be recompiled
// and so we now have a type mismatch here
printfn "%i" three
printfn "%s" dogcat
0
не будет компилироваться, что приведет к неудаче с этой жалобой:
let dogcat = add dog cat
^^^ - This expression was expected to have type int
but instead has type string
Хороший пример того, как целесообразно использовать inline, - это когда выхотите определить обобщенную функцию, чтобы изменить порядок применения аргументов функции с 2 аргументами, например,
let inline flip f x y = f y x
, как это сделано в ответе @pad на этот вопрос Другой порядок аргументов для получения N-го элемента Array, List или Seq .