OCaml的`类型a。一个t`语法

时间:2014-09-15 17:13:01

标签: syntax ocaml gadt locally-abstract-type

我在OCaml's documentation about GADTs中遇到了以下代码段:

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

,一旦在utop中评估,就会有以下签名:

val eval : 'a term -> 'a = <fun>

我还注意到,当用type a. a term -> a替换'a term -> 'a或只删除签名时,该函数不再编译。

...
| Add -> (fun x y -> x + y)
...
Error: This pattern matches values of type (int -> int -> int) term
  but a pattern was expected which matches values of type int term
  Type int -> int -> int is not compatible with type int 

那么这个符号是什么?是什么让它与'a t不同?

是否特定于GADT?

1 个答案:

答案 0 :(得分:3)

本手册解释了几节的语法:http://caml.inria.fr/pub/docs/manual-ocaml-400/manual021.html#toc80

简而言之,type a. ...意味着本地抽象类型a必须是多态的。