Наиболее общая форма:
(fun x -> x : int -> int)
Поскольку fun x -> x
это значение само по себе, оно может быть аннотированный с типом, как и любое другое выражение. Действительно, в этом аннотации типа можно опустить один из int
-х, так как другой может быть выведен компилятором:
(fun x -> x : int -> 'a)
или
(fun x -> x : 'a -> int)
все приведет:
- : int -> int = <fun>
Это также демонстрирует, что 'a
в аннотациях типа имеет различное значение от 'a
в подписях. В аннотации типа это означает: «Мне все равно, вы решаете». Вот почему правильное имя аннотаций типа ограничено типом, поэтому вы не аннотируете свое выражение с типом, но вы предоставляете дополнительное ограничение для системы вывода типов. В этом примере вы говорите ему: у меня есть это выражение и, пожалуйста, укажите его тип, давая ему функцию, которая возвращает int
.
Кроме того, вы можете использовать _
вместо переменных типа, точно так же, как вы можете сделать это для нормальных переменных:
(fun x -> x : _ -> int)
результат будет тот же.