Глава 12. Расширения языка
6 Получение типа модуля
(Добавлено в OCaml 3.12)
|
Конструкция 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, но позволяет использовать для внутреннего представления множеств другой способ.
© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/moduletypeof.html