如何";揭露;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
是可互换的。