Тип '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 варианты типов").