Приведение подтипа с помощью первоклассных модулей
Учитывая следующие сигнатуры модуля, где 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) *)
Является ли это фундаментальным ограничением первоклассных модулей? Каковы правила, определяющие, является ли тип модуля подтипом другого в базовом языке типов? И есть ли практический обходной путь?