Статически разрешаемые параметры типа (F#)
Статически разрешаемый параметр типа — это параметр типа, заменяемый фактическим типом на этапе компиляции, а не во время выполнения. Перед такими параметрами ставится символ крышки (^).
ˆtype-parameter
Заметки
В языке F# существует два разных вида параметров типов. Первый вид — это стандартный универсальный параметр типа. Такие параметры обозначаются апострофом, как в 'T и 'U. Они эквивалентны универсальным параметрам типа в других языках платформы .NET Framework. Другой вид является статически разрешаемым и обозначается символом крышки, как в ^T и ^U.
Статически разрешаемые параметры типа в первую очередь удобны в связи с ограничениями членов, т. е. ограничениями, позволяющими указать, что используемый аргумент типа должен быть определенным членом или членами. Ограничение такого вида невозможно создать с помощью обычного универсального параметра типа.
В следующей таблице перечислены общие черты этих двух видов параметров типов и различия между ними.
Функция |
Универсальный |
Статически разрешаемый |
---|---|---|
Синтаксис |
'T, 'U |
^T, ^U |
Время разрешения |
На этапе выполнения |
На этапе компиляции |
Ограничения членов |
Не может использоваться с ограничениями членов. |
Может использоваться с ограничениями членов. |
Создание кода |
Тип (или метод) со стандартными параметрами универсального типа дает при создании кода один универсальный тип или метод. |
Создается несколько экземпляров типов и методов, по одному для каждого требуемого типа. |
Использование с типами |
Может использоваться с типами. |
Не может использоваться с типами. |
Использование со встроенными функциями |
Нет. Встроенная функция не может быть параметризована со стандартным параметром универсального типа. |
Да. Статически разрешаемые параметры типа могут использоваться только со встроенными функциями или методами. |
Многие функции основной библиотеки F# (особенно операторы) имеют статически разрешаемые параметры типа. Эти функции и операторы являются встроенными, и приводят к созданию эффективного кода для численных вычислений.
Встроенные методы и функции, которые используют операторы или другие функции со статически разрешаемыми параметрами типа, и сами могут использовать статически разрешаемые параметры типа. Часто при определении типа такие встроенные функции определяются как имеющие статически разрешаемые параметры типа. В следующем примере демонстрируется определение оператора, который определяется как имеющий статически разрешаемый параметр типа.
let inline (+@) x y = x + x * y
// Call that uses int.
printfn "%d" (1 +@ 1)
// Call that uses float.
printfn "%f" (1.0 +@ 0.5)
Разрешенный тип оператора (+@) основывается на использовании операторов (+) и (*), оба из которых при определении типа приводят к ограничениям членов на статически разрешаемых параметрах типа. Разрешенный тип, как видно в интерпретаторе языка F#, имеет следующие значения.
^a -> ^c -> ^d
when (^a or ^b) : (static member (+) : ^a * ^b -> ^d) and
(^a or ^c) : (static member (+) : ^a & ^c -> ^b)
Выходные данные выглядят следующим образом.
2
1.500000