12.6 Восстановление типа модуля
(Введено в OCaml 3.12)
|
Конструкция модуль тип of выражение-модуля расширяется до типа модуля (подписи или типа функтора), выведенного для выражения модуля выражение-модуля. Для того, чтобы этот тип модуля можно было повторно использовать в различных ситуациях, он намеренно не усиливается: абстрактные типы и типы данных не явно связаны с типами исходного модуля. По той же причине, псевдонимы модулей в выведенном типе раскрываются.
Типичное использование, в сочетании с конструкцией 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/5.0/htmlman/moduletypeof.html