Spec-Zone.ru › OCaml 4.14

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

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

module-type ::= ...
∣ module type of module-expr

Конструкция 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

Spec-Zone.ru

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