Это только одно из возможных приложений, но первоклассные модули позволяют легко кодировать экзистенциальные типы, в основном модуль, упаковывающий экзистенциальный тип и значение, использующее этот тип). Например, см. Работу Алена Фриша по динамическим типам (код взят из работы Алена Фриша по типам: http://caml.inria.fr/cgi-bin/viewvc.cgi/ocaml/branches/dyntypes/stdlib/dyntypes.ml?view=markup)
module type DYN = sig
type t
val x: t
val t: t ttype
end
type dyn = (module DYN)
let dyn (type s) t x =
let module M = struct
type t = s
let x = x
let t = t
end
in
(module M : DYN)
Идея здесь в том, что «ttype» является конкретным представлением этого типа, алгебраическим типом данных с Int, конструкторами Float и т. Д., И у вас есть здесь значение, тип которого скрыт, но который несет конкретное представление этот тип, который вы можете использовать, например, для более безопасной сериализации / десериализации.