смысл этого синтаксиса ocaml - PullRequest
0 голосов
/ 21 апреля 2020

Я читаю lambdasoup / soup.ml на master · aantron / lambdasoup · GitHub , но не понимаю синтаксис.

and 'a node =
  {mutable self   : 'b. 'b node option;
   mutable parent : general node option;
   values         : [ `Element of element_values
                    | `Text of string
                    | `Document of document_values ]}

Я не понимаю 'b. 'b node option, если бы это было *, это было бы кортежем, но я впервые вижу с . И почему бэк-тай c в ветви (например, `Element)?

1 Ответ

3 голосов
/ 21 апреля 2020

Тип 'a . type - это тип, который явно полиморфен c в 'a. Итак, ваш пример 'b . 'b node option - это, очевидно, поле, содержимое которого является полиморфным c. Другими словами, любое значение, присвоенное полю, само должно быть polymorphi c.

Вот пример с list вместо node:

type a = { mutable self : 'b. 'b list option; }
# let x  = { self = None };;
val x : a = {self = None}
# x.self <- None;;
- : unit = ()
# x.self <- Some [];;
- : unit = ()
# x.self <- Some [3];;
Error: This field value has type int list option
     which is less general than 'b. 'b list option
# 

Вы можете назначить None до x.self, потому что None не является полиморфным c (его тип 'a option, который работает для любого типа параметра). Вы можете назначить Some [] на x.self, потому что это также полиморф c (его тип 'a list option, который работает для любого необязательного списка). Но вы не можете назначить Some [3] на x.self, потому что его тип int list option; другими словами, это не полиморф c.

Вы можете найти обсуждение явных типов полиморф c в Разделе 5.2.1 руководства OCaml.

Значения вариантов с лидирующей обратной кавычкой, такие как `A или `B, представляют собой так называемые полиморфные c варианты. Это другая особенность, чем обычные варианты вариантов. Основная идея c состоит в том, что вариант polymorphi c представляет значение, которое не обязательно является частью какого-либо предопределенного типа. Связанные типы по сути являются наборами этих значений. Варианты Polymorphi c также могут быть конструкторами, как в вашем примере типа; то есть они могут принимать ассоциированное значение. Так же, как вы можете иметь Some "yes", ваше определение позволяет иметь `Text "yes".

Вы можете найти некоторое обсуждение вариантов polymorphi c в Разделе 7.4 руководства OCaml ( поиск "polymorphi c варианты типов").

...