Вывод типа

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

Определение типа в целом

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

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

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

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

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

let f a b = a + b + 100

Можно повлиять на вывод типа, изменив литералы. Если сделать a, 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 #.

См. также