Глава 12. Расширения языка
14 Расширяемые вариантные типы
(Появились в OCaml 4.02)
|
Расширяемые вариантные типы — это вариантные типы, которые можно расширять новыми вариантными конструкторами. Расширяемые вариантные типы определяются с помощью ... Новые вариантные конструкторы добавляются с помощью +=.
module Expr = struct
type attr = ..
type attr += Str of string
type attr +=
| Int of int
| Float of float
end
При сопоставлении с образцом для расширяемого вариантного типа требуется вариант по умолчанию, обрабатывающий неизвестные вариантные конструкторы:
let to_string = function | Expr.Str s -> s | Expr.Int i -> Int.to_string i | Expr.Float f -> string_of_float f | _ -> "?"
Существующий пример расширяемого вариантного типа — встроенный тип exn, используемый для исключений. Конструкторы исключений можно объявлять с помощью синтаксиса расширения типа:
type exn += Exc of int
Расширяемые вариантные конструкторы можно связать с другими именами. Это позволяет экспортировать варианты из другого модуля.
# let not_in_scope = Str "Foo";; Error: Unbound constructor Str
type Expr.attr += Str = Expr.Str
# let now_works = Str "foo";; val now_works : Expr.attr = Expr.Str "foo"
Расширяемые вариантные конструкторы можно объявлять как private. Как и в случае обычных вариантов, это запрещает создавать их напрямую с помощью применения конструктора, но позволяет извлекать их компоненты при сопоставлении с образцом.
module B : sig type Expr.attr += private Bool of int val bool : bool -> Expr.attr end = struct type Expr.attr += Bool of int let bool p = if p then Bool 1 else Bool 0 end
# let inspection_works = function
| B.Bool p -> (p = 1)
| _ -> true;;
val inspection_works : Expr.attr -> bool = # let construction_is_forbidden = B.Bool 1;; Error: Cannot use private constructor Bool to create values of type Expr.attr
14.1 Приватные расширяемые вариантные типы
(Появились в OCaml 4.06)
|
Расширяемые вариантные типы можно объявлять как private. Это запрещает напрямую объявлять новые конструкторы, но позволяет ссылаться на конструкторы расширения в интерфейсах.
module Msg : sig
type t = private ..
module MkConstr (X : sig type t end) : sig
type t += C of X.t
end
end = struct
type t = ..
module MkConstr (X : sig type t end) = struct
type t += C of X.t
end
end
© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/extensiblevariants.html