Поделиться через


Встроенные функции (F#)

Встроенные функции — это функции, интегрированные напрямую в вызывающий код.

Использование встроенных функций

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

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

Модификатор inline может применяться к функциям на высшем уровне, уровне модуля или на уровне метода в классе.

В приведенном ниже примере кода показаны встроенная функция на высшем уровне, встроенный метод экземпляра и встроенный статический метод.

let inline increment x = x + 1
type WrapInt32() =
    member inline this.incrementByOne(x) = x + 1
    static member inline Increment(x) = x + 1

Встроенные функции и определение типа

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

let inline printAsFloatingPoint number =
    printfn "%f" (float number)

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

^a -> unit when ^a : (static member op_Explicit : ^a -> float)

Это означает, что функция принимает любой тип, поддерживающий преобразование в тип float.

См. также

Ссылки

Функции (F#)

Ограничения (F#)

Статически разрешаемые параметры типа (F#)