Что означает этот сегмент кода ocaml? - PullRequest
0 голосов
/ 06 ноября 2018

Я не могу понять этот код 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 голосов
/ 06 ноября 2018

Начиная с:

    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 и другой пример: Mads-hartmann .

Обратите внимание, что GADT был представлен в Ocaml 4.00 - поэтому ссылка на документацию, которую вы цитируете, устарела для этой конкретной функции, так как она относится к Ocaml 3.12. В настоящее время вы проверяете исходный код Ocaml 4.07.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...