2015-06-29 4 views
2

Предположим, у вас есть объявление с выведенной типа:назвать выведенный тип в OCaml

let f x y = x +. y 

Теперь, если вы используете этот тип в какой-либо другой выведенной типа:

let g h x = (if x > 0. then h else f) x x 

Вы, очевидно, есть тип-идентификатор между h и f. Если, однако, тип f усложняется, и вы все еще хотите, чтобы это было сделано (например, вы создаете код), тип g легко становится нечитаемым.

Есть ли способ представить декларацию типа в виде:

type mytype = <type of the function f above> 

И есть проверки типов клюшки к нему, то есть в приведенном выше примере, он должен дать:

val g : mytype -> float -> float 
+2

Нет. Нет способа определить синоним типа, как тип выражения. Вам нужно явно указать тип. Почему это проблема для вас? Что вы на самом деле пытаетесь сделать? Я подозреваю, что это проблема [XY] (http://xyproblem.info/). –

+0

Проблема в том, что я действительно генерирую код с довольно сложным типом. Я полагаюсь на проверку типа Ocaml (и свойство эквивалентности оригинала и сгенерированного кода), чтобы доказать тип безопасности исходного кода. Из-за сложности предполагаемых типов сообщения об ошибках вряд ли читабельны (и я также подозреваю, что это влияет на производительность). Определение типа я бы означало реализовать вывод типа для исходного кода, который я стараюсь избегать. – choeger

ответ

0

Вы можете сделать это, коснувшись через класс. Имя класса означает синоним типа, который вы не можете написать самостоятельно.

let f x y = x +. y 

class t = object 
    method f = f 
end 

let f_short = new t 

let g h x = (if x > 0. then h else f_short)#f x x 

Несчастливо, у этого будет некоторое время выполнения. Если вы в отчаянии, вы можете дублировать все определения, вызывая неклассические и используя другие для ошибок типа - это было бы довольно неясным.

0

Конечно, вы можете, функция в OCaml - это просто регулярное значение, которое имеет тип. Например, для функции f используется float -> float -> float. Вы можете создать тип аббревиатуру для этого типа:

type binop = float -> float -> float 

Вы можете позже обратиться к этому типу, чтобы сделать пометки типа лаконичнее:

let g : binop -> float -> float = fun h x -> (if x > 0. then h else f) x x; 

Но обратите внимание, что система типов в OCaml является структурным , но не номинальным. В условиях неспециалиста это означает, что типы проверяются не по имени, а по содержанию, если только вы не скрываете содержимое путем абстракции модуля. Таким образом, это binop является только аббревиатурой, тип по-прежнему float -> float -> float

+0

Я хорошо знаком с системой типа OCaml. Мой вопрос состоял в том, чтобы я мог ввести аббревиатуру без необходимости вручную определять ее правую сторону. – choeger

+0

Вы имеете в виду, что вы ищете какой-то оператор '# typeof'? – ivg

+0

В принципе, да, но не как часть некоторого отражения API, а просто как выражение типа. – choeger

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