Interface 多个模块是否可以具有相同的模块类型?如何组织它们及其接口文件?
目前,我在同一个OCaml文件中,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
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
通常,完全没有显式接口文件比较容易,除非您确实需要将模块的某些部分设置为私有