Interface 多个模块是否可以具有相同的模块类型?如何组织它们及其接口文件?

Interface 多个模块是否可以具有相同的模块类型?如何组织它们及其接口文件?,interface,ocaml,functor,Interface,Ocaml,Functor,目前,我在同一个OCaml文件中, blah.ml: module type blah = sig val a : some-type end module type X = sig val x : some-type end module Y : X = struct let x = some-def end module Z : X = struct let x = some-other-def end blah.mli如下所示: modul

目前,我在同一个OCaml文件中,
blah.ml

module type blah = 
 sig 
  val a : some-type
 end

module type X = 
 sig
  val x : some-type
 end

module Y : X = 
 struct
  let x = some-def
 end

module Z : X = 
 struct
  let x = some-other-def
 end
blah.mli
如下所示:

module type blah = 
 sig
  val a
 end

module type X = 
 sig
  val x : some-type
 end

module Y : X

module Z : X
我希望X、Y和Z位于具有单独接口的单独文件中。我如何在Y.mli和Z.mli中判断Y和Z的类型是X


如有任何相关阅读资料,也将不胜感激。有很多资源讨论模块、接口和functor,但它们没有提到具有其他模块类型的模块的接口文件。

您可以创建包含sig的
x.ml
、包含模块的
y.ml
和包含该模块的
z.ml
。您不需要做任何特殊的事情来告诉编译器
Y:X
Z:X
。编译器根据模块符合类型的事实自动推断模块类型,即它实现模块类型所需的每个绑定。如果
Y
Z
不符合要求,则类型错误将显示在使用点

如果您想在定义点限制模块类型,这也是可行的,可以为每个模块提供一个接口文件,并在其中包含所需的签名。例如:

(* x.ml *)
module type S = sig
  val x : some-type
end

(* y.mli *)
include X.S

(* y.ml *)
let x = some-def
……等等

然而,由于签名隐藏了太多关于类型的细节,这通常变得过于严格。因此,实际上,您可能需要添加类型相等共享约束,以避免在需要公开更多类型信息的地方出现编译错误。例如:

(* y.mli *)
include X.S with type t = int

通常,完全没有显式接口文件比较容易,除非您确实需要将模块的某些部分设置为私有。

您可以创建包含sig的
x.ml
、包含模块的
y.ml
和包含该模块的
z.ml
。您不需要做任何特殊的事情来告诉编译器
Y:X
Z:X
。编译器根据模块符合类型的事实自动推断模块类型,即它实现模块类型所需的每个绑定。如果
Y
Z
不符合要求,则类型错误将显示在使用点

如果您想在定义点限制模块类型,这也是可行的,可以为每个模块提供一个接口文件,并在其中包含所需的签名。例如:

(* x.ml *)
module type S = sig
  val x : some-type
end

(* y.mli *)
include X.S

(* y.ml *)
let x = some-def
……等等

然而,由于签名隐藏了太多关于类型的细节,这通常变得过于严格。因此,实际上,您可能需要添加类型相等共享约束,以避免在需要公开更多类型信息的地方出现编译错误。例如:

(* y.mli *)
include X.S with type t = int
通常,完全没有显式接口文件比较容易,除非您确实需要将模块的某些部分设置为私有