10.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-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/moduletypeof.html