Types mli文件和ml文件内签名之间的OCaml共享结构
我最终要做的事情是1)限制对模块(因此是mli文件)的可见性,2)定义一个函子,其中参数有一个“规范实现”,作为Types mli文件和ml文件内签名之间的OCaml共享结构,types,module,ocaml,Types,Module,Ocaml,我最终要做的事情是1)限制对模块(因此是mli文件)的可见性,2)定义一个函子,其中参数有一个“规范实现”,作为ml/mli对存在于源代码树中,并坚持参数具有与此规范实现相同的形状 假设我有一个文件concat.ml,其中包含一个用于字符串连接的函数 (* concat.ml *) type t = string let concat x y = x ^ y 我有一个接口 (* concat.mli *) type t val concat : t -> t -> t 但是,我还
ml
/mli
对存在于源代码树中,并坚持参数具有与此规范实现相同的形状
假设我有一个文件concat.ml
,其中包含一个用于字符串连接的函数
(* concat.ml *)
type t = string
let concat x y = x ^ y
我有一个接口
(* concat.mli *)
type t
val concat : t -> t -> t
但是,我还有一个类似于此的函子join
,它希望得到与Concat
形状相同的东西。(join的实现是故意幼稚的):
为了表达“与Concat形状相同”的约束,我必须制作另一个ml
文件Concat_type.ml
,如下所示:
(* concat_type.ml *)
module type TYPE = sig
type t
val concat : t -> t -> t
end
(* concat.mli *)
include Concat_type.TYPE
Concat\u type.type
和Concat
mli在本例中几乎相同。我创建concat_type.ml
的唯一原因是为了支持functorJoin
,并明确限制它在模拟concat
实现的模块中所能看到的内容
是否有办法将
Concat\u type.type
导入Concat
接口,或者反过来导入Concat
接口,或者有其他方法避免它们之间的重复?是的,可以通过Concat\u type.type
模块类型来表达Concat
模块接口。还可以获取现有模块的模块类型
第一种方法如下所示:
(* concat_type.ml *)
module type TYPE = sig
type t
val concat : t -> t -> t
end
(* concat.mli *)
include Concat_type.TYPE
第二种方法允许您摆脱Concat_类型
,尽管我个人不喜欢它,因为我不喜欢模块类型的
构造。但仍然有一种可能性:
module type Concat = module type of Concat
module Join (X : Concat) = struct
...
end
您应该能够在Concat.mli中使用
include Concat_type.type
,我认为您可以使用Concat的模块类型
,例如,模块连接(X:Concat的模块类型):sig…
。