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