2015-10-24 2 views
1

В базовом примере GADT из §7.20 из ocaml manual, что означает «тип a». ? Почему объявления "eval: термин -> a" недостаточно?ocaml GADT: почему «типа a». нужно?

type _ term = 
      | Int : int -> int term 
      | Add : (int -> int -> int) term 
      | App : ('b -> 'a) term * 'b term -> 'a term 

     let rec eval : type a. a term -> a = function 
      | Int n -> n     (* a = int *) 
      | Add  -> (fun x y -> x+y) (* a = int -> int -> int *) 
      | App(f,x) -> (eval f) (eval x) 
+0

Я не являюсь теоретиком типа, но, прочитав ссылку, данную @nnarklrh, мне кажется, что функция 'eval' требует полиморфной рекурсии и наличия' type a. ... 'отчасти является сигналом для поддержки его поддержки. Если вы не укажете 'type', вы получите ошибки, которые вы ожидаете от попыток использовать полиморфную рекурсию, если это не разрешено. –

ответ

3

slide на ML'2011 мастерской Жака имеет хорошее введение. Идея использовать синтаксис локально абстрактного типа для введения универсальной переменной с выражением.

+0

приятные слайды! спасибо –

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