Spec-Zone.ru › OCaml
☰Язык OCaml
  • Язык OCaml
  • Расширения языка

Глава 12 Расширения языка

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

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

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

Конструкция 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, но позволяет ему представлять множества внутренне по-другому.

« Модули первого классаЗамена внутри подписи »
Авторское право © 2024 Institut National de Recherche en Informatique et en Automatique

© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/moduletypeof.html

Spec-Zone.ru

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