Использование `inline` в F #
============================

`inline` Мне кажется, что ключевое слово в F # имеет несколько иную цель, чем то, к чему я привык, например. C. Например, кажется, что это влияет на тип функции (что такое «статически разрешаемые параметры типа»? Разве не все типы F # разрешены статически?)

Когда я должен использовать`inline` функции?

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

Основным случаем, когда это применимо, является использование операторов.

будет иметь мономорфный предполагаемый тип (вероятно,`int -> int -> int`, но это может быть что-то вроде`float -> float -> float` если у вас есть код, который использует эту функцию вместо этого типа). Однако, пометив эту функцию как встроенную, компилятор F # выведет полиморфный тип:

Нет способа кодировать это ограничение типа первоклассным способом в скомпилированном коде в .NET. Однако компилятор F # может применять это ограничение на сайте, где он указывает функцию, так что все операции оператора разрешаются во время компиляции.

Параметры типа`^a`, `^b`, а также`^c` являются «статически разрешаемыми параметрами типа», что означает, что типы аргументов должны быть статически известны на сайте, где используются эти параметры. Это в отличие от параметров нормального типа (например,`'a`, `'b`и т. д.), где параметры означают что-то вроде «некоторого типа, который будет предоставлен позже, но который может быть любым».



Когда я должен использовать`inline` функции?

Наиболее ценное применение`inline` Ключевым словом на практике является встраивание функций более высокого порядка в сайт вызова, где их аргументы функции также встроены для создания по отдельности полностью оптимизированного фрагмента кода.

Например,`inline` В следующих`fold` функция делает это в 5 раз быстрее:

Обратите внимание, что это мало похоже на то, что`inline` делает на большинстве других языков. Вы можете добиться аналогичного эффекта, используя шаблонное метапрограммирование в C ++, но F # также может быть встроенным между скомпилированными сборками, потому что`inline` передается через метаданные .NET.