Spec-Zone.ru › OCaml
☰Язык OCaml
  • Язык OCaml
  • Расширения языка

Глава 12. Расширения языка

6 Получение типа модуля

(Добавлено в OCaml 3.12)

module-type ::= ...
∣ module type of module-expr

Конструкция module type of module-expr раскрывается в тип модуля (сигнатуру или тип функтора), выведенный для выражения модуля module-expr. Чтобы этот тип модуля можно было повторно использовать в разных ситуациях, он намеренно не усиливается: абстрактные типы и типы данных явно не связываются с типами исходного модуля. По той же причине в выведенном типе раскрываются псевдонимы модулей.

Типичное применение этой конструкции в сочетании с конструкцией include на уровне сигнатуры — расширение сигнатуры существующей структуры. В этом случае необходимо сохранить равенство типов типам исходного модуля. Этого можно добиться с помощью следующего идиоматического приёма.

module type MYHASH = sig
  include module type of struct include Hashtbl end
  val replace: ('a, 'b) t -> 'a -> 'b -> unit
end

Сигнатура MYHASH содержит все поля сигнатуры модуля Hashtbl (с усиленными определениями типов), а также новое поле replace. Реализацию этой сигнатуры легко получить, снова воспользовавшись конструкцией include, но на этот раз на уровне структуры:

module MyHash : MYHASH = struct
  include Hashtbl
  let replace t k v = remove t k; add t k v
end

Отсутствие усиления удобно и в другом случае — когда требуется предоставить альтернативную реализацию существующего модуля.

module MySet : module type of Set = struct
  …
end

Этот идиоматический приём гарантирует совместимость Myset с Set, но позволяет использовать для внутреннего представления множеств другой способ.

« Функции, зависящие от модулей, и модули первого классаПодстановка внутри сигнатуры »
Copyright © 2026 Institut National de Recherche en Informatique et en Automatique

© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/moduletypeof.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API