如何解决 OCaml 循环构建错误?

How do you resolve an OCaml circular build error?

我的代码产生了循环构建错误,我查找了该错误。此页面提供了我的 .mli 文件中内容的类似但较小的示例:https://ocaml.org/learn/tutorials/ocamlbuild/New_kinds_of_build_errors.html

本质上,问题是我的文件既定义了类型又定义了使用相同类型的参数和 return 值的函数。然而,这正是我希望我的程序做的。我的类型不是私有的,它在 .mli 文件中明确声明:

type state = {
 current_pos : int*int;
 contents : int*int list;
}

val update_state : state -> state

在我看来,想要构建一个定义类型的模块然后与其他文件共享该类型是合理的,但循环构建错误似乎总是会阻止这种情况发生。有什么 "more proper" 方法可以进行这种分享吗?

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

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

关键是你不应该在模块定义中使用模块的名称。

而不是这个(在 a.ml 中):

type t = int
let x : A.t = 14

你应该有这个:

type t = int
let x: t = 14

如果你的代码真的像这个例子,你只需要删除 .ml 文件中的模块名称。

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