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


Вывод типа (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#)