如何";揭露;OCaml中的类型

如何";揭露;OCaml中的类型,ocaml,Ocaml,我有两个编译单元和一个“前端”文件 在第一个编译单元中,moduleA.mli中有以下内容: module A : sig type t ... end module B : sig type t ... end 在模块a.ml中,我有: module A = struct type t = float * float ... end open moduleA module B = struct type t = A.t ... e

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

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

module A : sig
   type t
   ... 
end
module B : sig
   type t
   ... 
end
模块a.ml
中,我有:

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

module B = struct
   type t = A.t
   ... 
end
在第二个编译单元中,
moduleB.mli
中包含以下内容:

module A : sig
   type t
   ... 
end
module B : sig
   type t
   ... 
end
moduleB.ml
中,我有:

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

module B = struct
   type t = A.t
   ... 
end
现在,在“前端”文件中,我得到了如下类型的错误:

此表达式的类型为moduleB.B.t,但表达式的类型应为moduleA.A.t


但正如我所定义的,它们应该是同义词(两者都是
float*float
)。如何“公开”这些类型,以便Ocaml知道它们是相同的?

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


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

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


如果要公开
A.t=B.t
的信息,则该信息必须是签名的一部分。因此,只需将
B
签名中的
type t
更改为
type t=A.t
,现在这个等式将成为模块公共界面的一部分,其他模块可以依赖它。

您想让其他模块知道两者都是
float*float
还是两者都是相同的?换句话说,您希望“前端”能够将
A.t
B.t
视为元组,还是只能够在需要
A.t
的地方使用
B.t
的值(反之亦然)?@sepp2k后者。它不需要知道它们是元组(我有可以操作它们的函数),但我想让它知道
B.t
A.t
是可互换的。你想让其他模块知道它们都是
float*float
还是两者都是相同的?换句话说,您希望“前端”能够将
A.t
B.t
视为元组,还是只能够在需要
A.t
的地方使用
B.t
的值(反之亦然)?@sepp2k后者。它不需要知道它们是元组(我有可以对它们进行操作的函数),但我想让它知道
B.t
A.t
是可互换的。