2014-11-26 3 views
1

У меня есть анонимные функции:Написать спецификации для анонимной функции

fun x -> x;; 
- : 'a -> 'a = <fun> 

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

Было бы полезно получить некоторую ссылку на этот синтаксис и расширить этот пример с помощью такой аннотации.

Спасибо.

ответ

2

Наиболее общая форма:

(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) 

результат будет тот же.

3
# fun (x: int) -> x;; 
- : int -> int = <fun> 
# 

Причиной этого является то, что работает

  • Параметры функции задаются в виде узоров.

  • Одной из альтернатив для patttern имеет вид:

    (картина: typexpr)

Синтаксис для образцов приведен в Section 6.6 of the OCaml manual.

Смежные вопросы