【问题标题】:OCaml signature dependencies errorOCaml 签名依赖错误
【发布时间】:2014-01-10 21:32:32
【问题描述】:

我有以下模块签名A

module type A =
 sig
  type exp =
    Int of int
    | Var of string
end;;

我可以编译它以获得a.mlia.cmi 文件。但是,如果我定义B:

module type B =
 sig
  val compute : A.exp -> A.exp
 end;;

运行ocamlc -i b.ml 会产生错误Unbound type constructor A.exp。这是为什么呢?

【问题讨论】:

    标签: compilation dependencies ocaml signature


    【解决方案1】:

    OCaml 免费为您提供一个外部模块,对应每个源文件。因此,您正在定义一个名为 A.A. 的模块类型。请注意,它是一个模块type,而不是一个模块。

    您的 a.ml(和 a.mli,如果您愿意)可能只包含以下内容:

    type exp = Int of int | Var of string
    

    然后你可以从你的 b.ml 文件中引用 A.exp。

    另外,请注意 a.mli 是一个 source 文件。如果你有a.mli文件,你需要编译它来创建a.cmi。

    【讨论】:

    • 是否有可能以某种方式使用签名但避免A.A?我正在尝试从一些我没有源代码的代码中复制签名,只有签名。虽然您的方法适用于上述类型定义,但我不知道如何为 val 执行此操作。
    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 2013-03-19
    • 2014-12-13
    • 2018-04-10
    • 2015-02-10
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多