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

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

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

Ответы на вопрос(2)

Решение Вопроса

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

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

let add a b = a + b

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

let inline add a b = a + b
// add has type ^a ->  ^b ->  ^c when ( ^a or  ^b) : (static member ( + ) :  ^a *  ^b ->  ^c)

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

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

 George16 авг. 2014 г., 18:53
p:'a - требует, чтобыp быть потомком типа'a такие какint, obj, 'a when 'a :> SomeBaseTypeи т. д. С другой стороны,p:^a - требует, чтобыp быть типом, который поддерживает некоторые функции или подтип в точках вызова кода, делая это напрямую или открывая вспомогательный модуль или обращаясь к классу методов расширения и т. д.
 knocte15 янв. 2014 г., 15:04
Извините, но я только начинаю изучать F # и совсем не понимаю вашего ответа. Можете ли вы сказать мне какой-нибудь URL, где объясняются используемые вами концепции?

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

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

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

  let inline fold f a (xs: _ []) =
     let mutable a = a
     for i=0 to xs.Length-1 do
        a <- f a xs.[i]
     a

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

 J Cooper21 сент. 2010 г., 19:19
Сгиб стандартной библиотеки встроен?
 Jon Harrop22 сент. 2010 г., 15:09
@ Стефан: Да, все время. Мы используемinline много и (нелогично) не из-за встраивания, которое он выполняет!
 Sarge Borsch03 сент. 2013 г., 20:25
@JonHarrop Да,inline также может дать гораздо более полезные типы функций, как отмечено в ответе kvb. Это действительно потрясающе.
 J Cooper21 сент. 2010 г., 22:47
Интересно. Будет ли недостаток встроенного использованияinline?
 Jon Harrop22 сент. 2010 г., 00:09
@J Купер: Дон беспокоился о раздутии из-за чрезмерного наклона, поэтому он хорошо учитывает все. Тем не менее, я думаю, что это будет нормально, потому что программисты на C # каждый раз выписывают явный цикл вручную.
 Jon Harrop21 сент. 2010 г., 21:47
@J Купер: Нет, но он преобразует аргумент своей функции в оптимизированное закрытие, которое помогает определенным типам.fold Я дал ~ 3 раза быстрее, чем встроенныйArray.fold например, применительно к комплексным числам.
 Stephen Swensen22 сент. 2010 г., 00:51
Чувак, в 3-5 раз быстрее ... это много! Приходилось ли вам когда-либо использовать этот встроенный сгиб по стандартным библиотечным сгибам при разработке критичных для производительности библиотек?

Ваш ответ на вопрос