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


Статически разрешаемые параметры типа (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

См. также

Ссылки

Универсальные шаблоны (F#)

Вывод типа (F#)

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

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

Другие ресурсы

Автоматическое обобщение (F#)