Dadas as seguintes assinaturas de módulo, onde B
subsumes A
:
module type A = sig
type t
end
module type B = sig
type t
val x: t
end
Normalmente, qualquer módulo que satisfaça B
também satisfará A
. No entanto, isso não se estende automaticamente aos módulos de primeira classe, porque é claro que é uma linguagem de tipo diferente que não permite a unificação automática com subtipos. Mas a coerção manual ainda deveria funcionar, não deveria? (Na verdade, isso acontece se as assinaturas do módulo contiverem apenas definições de tipo, mas não se contiverem valores.)
let f (_: (module A)) = ()
let g (b: (module B)) = f (b :> (module A)) (* Error: Type (module B) is not a subtype of (module A) *)
Esta é uma limitação fundamental dos módulos de primeira classe? Quais são as regras que determinam se um tipo de módulo é um subtipo de outro na linguagem de tipo principal? E existe uma solução prática?