给定以下模块签名,其中B
包含A
:
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) *)
这是一流模块的基本限制吗?在核心类型语言中,确定一个模块类型是否是另一个模块类型的子类型的规则是什么?有没有实际的解决方法?