gpt4 book ai didi

module - OCaml 交联

转载 作者:行者123 更新时间:2023-12-04 14:06:47 24 4
gpt4 key购买 nike

引用链接在 OCaml 中如何工作?

例如,假设我有 3 个模块声明为

  • A.ml
  • B.ml
  • C.ml

  • 其中
  • A需要BC
  • B需要A

  • 我应该如何进行编译?

    由于订单是相关的,使用 ocamlcocamlopt如何修复 B 之间的交叉引用和 A ?

    我正在尝试首先将它们全部编译成 .cmoocamlc -c然后将所有这些链接在一起但没有成功,因为交换参数只会将问题从一个模块转移到另一个模块。

    具体错误是:

    Error: Error while linking A.cmo: Reference to undefined global `B'



    (反之亦然,如果我交换 args 的顺序)

    我认为这是一个简单的问题,但我无法解决它..提前谢谢

    最佳答案

    您必须结合 modules into one file and make them recursive .我不相信有办法从两个单独文件的编译过程中做到这一点。

    module rec A : 
    sig
    val f : int -> int
    val g : int -> int
    end =
    struct
    let f x = (B.g x) + 1
    let g x = x + 1
    end
    and B :
    sig
    val f : int -> int
    val g : int -> int
    end =
    struct
    let f x = (A.g x) + 1
    let g x = x + 1
    end

    编辑:根据您的评论,我猜您有解析器的类型定义以及在同一文件中处理/操作该类型的函数。我同意你的观点,这是有道理的。但是就像您所经历的那样,如果该文件不仅要对类型进行操作,还要调用解析器来生成数据,那么解析器将如何构造它呢?我的解决方案是将类型分离到它自己的模块中,并在执行操作的模块中打开该模块。

    因此,您正在拆分 A转换为( AA' ),其中 A'包含由 B 生成的类型, 并用于 A .你的依赖变成了,
  • A需要A'BC
  • B需要A'

  • 例如,我有一个配置文件解析器,用于启动我编写的任何应用程序。

    ConfType   --contains the type t  
    Conf --calls parser, and contains helper functions for type ConfType.t
    ConfParser --for ocamlyacc
    ConfLexer --for ocamllex


    所有这些的替代方法是使用多态变体。通过这种方式,您可以删除依赖项,因为它们是临时定义的。当然,解析器生成的类型可能与 Conf 中的不同,编译器将无法帮助您解决错误。

    关于module - OCaml 交联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3159137/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com