В базовом примере GADT из §7.20 руководства по ocaml, что означает «тип а». ? Почему недостаточно объявить eval: a term -> 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)
eval
требует полиморфной рекурсии, а присутствиеtype a. ...
отчасти является сигналом для включения ее поддержки. Если вы опуститеtype
, вы получите ошибки, которых ожидаете от попытки использовать полиморфную рекурсию, когда это не разрешено. - person Jeffrey Scofield   schedule 24.10.2015