如何在 OCaml 中 "expose" 类型

How to "expose" types in OCaml

我有两个编译单元和一个“前端”文件。

在第一个编译单元中,我在moduleA.mli中有以下内容:

module A : sig
   type t
   ... 
end

moduleA.ml 我有:

module A = struct
   type t = float * float
   ... 
end

在第二个编译单元中,我在moduleB.mli中有以下内容:

module B : sig
   type t
   ... 
end

moduleB.ml 我有:

open moduleA

module B = struct
   type t = A.t
   ... 
end

现在,在“前端”文件中,我收到如下类型错误:

This expression has type moduleB.B.t but an expression was expected of type moduleA.A.t

然而正如我所定义的,它们应该是同义词(都是 float * float)。我怎样才能从本质上“公开”这些类型,以便 Ocaml 知道它们是相同的?

当您将一个模块拆分为一个签名和一个实现时,只有签名中的信息可以被其他模块使用,其他任何内容都是实现私有的。因此,当其他模块查看您的模块 AB 时,他们看到的只是 type t 和另一个 type t 并且他们不知道它们指的是同一类型。

如果要公开 A.t = B.t 的信息,该信息需要成为签名的一部分。因此,只需将 B 的签名中的 type t 更改为 type t = A.t,现在这个等式将成为模块 public 接口的一部分,并且可以被其他模块依赖。