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


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

В этом разделе описывается, как компилятор F# делает вывод о типах значений, переменных, параметров и возвращаемых значений.

Общее описание вывода типа

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

Вывод типов параметров и возвращаемых значений

В списке параметров не требуется указывать тип каждого параметра.F# — язык со статической типизацией, поэтому во время компиляции каждое значение и выражение имеют определенный тип.Типы, которые не указаны явным образом, компилятор определяет на основе контекста.Если тип не указан, делается вывод, что он является универсальным.Если код использует значение несовместимым образом, в результате чего не существует единственного выведенного типа, который удовлетворяет всем вариантам использования значения, компилятор сообщает об ошибке.

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

Например, в следующем коде делается вывод о том, что тип параметров a и b и тип возвращаемого значения — int, поскольку литерал 100 имеет тип int.

let f a b = a + b + 100

Можно повлиять на вывод типа, изменив литералы.Если для литерала 100 обеспечить тип uint32, присоединив суффикс u, будет сделан вывод о том, что параметры a и b и возвращаемое значение имеют тип uint32.

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

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

// Type annotations on a parameter.
let addu1 (x : uint32) y =
    x + y

// Type annotations on an expression.
let addu2 x y =
    (x : uint32) + y

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

let addu1 x y : uint32 =
   x + y

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

let replace(str: string) =
    str.Replace("A", "a")

Автоматическое обобщение

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

Например, следующая функция объединяет два параметра любого типа в кортеж.

let makeTuple a b = (a, b)

Делается следующий вывод о типе.

'a -> 'b -> 'a * 'b

Дополнительные сведения

Вывод типа более подробно рассматривается в спецификации языка F#.

См. также

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

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