Spec-Zone.ru › OCaml 5.0

12.6 Восстановление типа модуля

(Введено в OCaml 3.12)

тип-модуля ::= ...
∣ модуль тип of выражение-модуля

Конструкция модуль тип 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

Spec-Zone.ru

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