【问题标题】:How do you resolve an OCaml circular build error?如何解决 OCaml 循环构建错误?
【发布时间】:2020-03-07 10:04:32
【问题描述】:

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

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

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

val update_state : state -> state

在我看来,构建一个定义类型的模块然后与其他文件共享该类型似乎是合理的,但循环构建错误似乎总是会阻止这种情况。有没有一些“更合适”的分享方式?

【问题讨论】:

    标签: interface ocaml private public


    【解决方案1】:

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

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

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

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

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

    你应该有这个:

    type t = int
    let x: t = 14
    

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

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

    【讨论】:

    • 我明白了,我认为循环错误的实际来源是接口打开了模块。我曾假设当您编写open ThisModule 时,它会访问源代码,因此可以将其包含在界面中。但是删除该行后,我不再收到循环错误。
    • 对,您也不应该在其内部打开模块! open 的唯一目的是使名称可用。但是当前模块的名称已经可用(允许递归定义)。
    猜你喜欢
    • 2020-11-01
    • 2021-01-09
    • 1970-01-01
    • 2021-05-23
    • 2022-09-22
    • 2021-03-09
    • 2016-11-02
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多