Приведение подтипа с помощью первоклассных модулей

Учитывая следующие сигнатуры модуля, где subsumes:

      module type A = sig
  type t
end

module type B = sig
  type t
  val x: t
end

Обычно любой модуль, удовлетворяющий условиямBтогда тоже удовлетворитA. Однако это не распространяется автоматически на первоклассные модули, поскольку, конечно, это язык другого типа, который не допускает автоматической унификации с подтипами. Но ручное принуждение все равно должно работать, не так ли? (Фактически это так, если сигнатуры модулей содержат только определения типов, но не если они содержат значения.)

      let f (_: (module A)) = ()
let g (b: (module B)) = f (b :> (module A)) (* Error: Type (module B) is not a subtype of (module A) *)

Является ли это фундаментальным ограничением первоклассных модулей? Каковы правила, определяющие, является ли тип модуля подтипом другого в базовом языке типов? И есть ли практический обходной путь?

0 ответов

Другие вопросы по тегам