Interface 如何解决OCaml循环生成错误?

Interface 如何解决OCaml循环生成错误?,interface,ocaml,private,public,Interface,Ocaml,Private,Public,我有产生循环构建错误的代码,我查找了错误。本页提供了一个类似但较小的示例,说明my.mli文件中的内容: 本质上,问题在于我的文件既定义了一个类型,又定义了使用相同类型的参数和返回值的函数。然而,这正是我想要我的程序做的。我的类型不是私有类型,它在.mli文件中显式声明: 类型状态={ 当前位置:int*int; 内容:int*int列表; } val更新_状态:状态->状态 在我看来,构建一个定义类型的模块并与其他文件共享该类型似乎是合理的,但循环构建错误似乎总是会阻止这种情况的发生。有没有更

我有产生循环构建错误的代码,我查找了错误。本页提供了一个类似但较小的示例,说明my.mli文件中的内容:

本质上,问题在于我的文件既定义了一个类型,又定义了使用相同类型的参数和返回值的函数。然而,这正是我想要我的程序做的。我的类型不是私有类型,它在.mli文件中显式声明:

类型状态={ 当前位置:int*int; 内容:int*int列表; } val更新_状态:状态->状态
在我看来,构建一个定义类型的模块并与其他文件共享该类型似乎是合理的,但循环构建错误似乎总是会阻止这种情况的发生。有没有更合适的方法来进行共享?

您发布的代码没有任何问题。它编译得很好。所以问题出在您的.ml文件中

您指向的页面显示的代码不正确。唯一需要指出的一点是,如果使用ocamlbuild,将得到与直接编译文件不同的错误

关键的一点是,您不应该在模块的定义中使用模块的名称

而不是在a.ml中:

type t = int
let x : A.t = 14
你应该有这个:

type t = int
let x: t = 14
如果您的代码与此示例非常相似,则只需删除.ml文件中的模块名


正如您所说,您要做的是迄今为止最常用的模块。

我明白了,我认为循环错误的实际来源是接口打开了模块。我曾假设,当您编写openthismodule时,它会访问源代码,因此可以将其包含在接口中。但是在删除行之后,我不再得到循环错误。对,你也不应该在它内部打开一个模块!open的唯一目的是提供名称。但是,当前模块的名称已经可用,并且允许递归定义。