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