如何解决 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 文件中的模块名称。
正如您所说,您想要做的是迄今为止最常见的模块用法。
我的代码产生了循环构建错误,我查找了该错误。此页面提供了我的 .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 文件中的模块名称。
正如您所说,您想要做的是迄今为止最常见的模块用法。