Глава 12 Расширения языка
6 Восстановление типа модуля
(Введено в OCaml 3.12)
|
Конструкция module type 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-2024 INRIA.
https://ocaml.org/manual/5.2/moduletypeof.html