此ocaml代码段的含义是什么?

时间:2018-11-06 08:42:42

标签: ocaml

我无法从ocaml编译器源代码中理解此ocaml代码:

File: d:\src\ocaml-4.07.0\driver\pparse.ml
50: type 'a ast_kind =
51: | Structure : Parsetree.structure ast_kind
52: | Signature : Parsetree.signature ast_kind

定义了ast_kind类型,定义了类型参数'a,但不使用它?

我知道类型定义的常见用法如下:

type a=
|A of int
|B of int

所以

Structure : Parsetree.structure ast_kind

意味着什么?结构的类型是Parsetree.structure?还是ast_kind?

我阅读了官方文档: http://caml.inria.fr/pub/docs/manual-ocaml-312/manual016.html#@manual.kwd53

它告诉我只有在定义记录时才能使用“:”

type-representation ::= = constr-decl  { | constr-decl }   
                     ∣  = { field-decl  { ; field-decl } }

field-decl ::= field-name :  poly-typexpr   
           ∣  mutable field-name :  poly-typexpr 

那么这段代码是什么意思?谢谢!

1 个答案:

答案 0 :(得分:2)

开始于:

    50: type 'a ast_kind =
    51: | Structure : Parsetree.structure ast_kind
    52: | Signature : Parsetree.signature ast_kind

内容如下:

第50行:我们定义参数为ast_kind的参数化类型'a。稍后在第51和52行中定义该参数。 第51行:'a参数类型为Parsetree.structure 同样,对于第52行。

现在,更一般而言,ast_kind是GADT类型(广义代数数据类型),请参见GADT-manual和另一个示例:Mads-hartmann

请注意,GADT已在Ocaml 4.00中引入-因此,您引用的有关文档的链接针对该特定功能已经过时,因为它引用了Ocaml 3.12。您目前正在检查Ocaml 4.07的源代码。