我正在尝试理解关于OCaml模块及其编译的一个具体问题:
在特定的.ml
实现中,我是否被迫重新声明已在.mli
中声明的类型?
举个例子:
(* foo.mli *)
type foobar = Bool of bool | Float of float | Int of int
(* foo.ml *)
type baz = foobar option
按照我的常规接口/实现思路,这应该是可以的,但它显示:
错误:未绑定类型构造函数 foobar
尝试编译时出现问题。
ocamlc -c foo.mli
ocamlc -c foo.ml
当然,如果我也在foo.ml
内部声明foobar
,那么错误就消失了,但这似乎是一种复杂的方法,因为我必须在每次更改时保持同步。
有没有办法避免这种冗余,或者我必须每次重新声明类型?
提前感谢
.ml
文件推断与耦合的.mli
中描述的类型。据我所知,实际实现__强制冗余__,但也要求__两个签名必须相等__,因此这实际上是将相同的声明加倍。这就是为什么我认为它应该意识到这些声明,而不必复制和粘贴它们。根据我的理解,类型推断算法不会出现问题。 - Jack