Types mli文件和ml文件内签名之间的OCaml共享结构

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 但是,我还

我最终要做的事情是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
但是,我还有一个类似于此的函子
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
的唯一原因是为了支持functor
Join
,并明确限制它在模拟
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…