【问题标题】:How to prevent OCaml batteries from overriding values如何防止 OCaml 电池覆盖值
【发布时间】:2014-06-28 21:33:27
【问题描述】:

Batteries.Num 包覆盖了函数 (+), (-), ... 所以编译器在下面的简单代码上会报错

open Batteries
open Num
let a = 4 + 4;;

文件“a.ml”,第 3 行,字符 8-9: 错误:此表达式的类型为 int,但表达式应为类型 Batteries.Num.num = Num.num

我使用“ocamlfind ocamlc -package battery a.ml”进行编译。

编辑:我知道我可以使用 Pervasives.(+) 或者只是在本地打开 Num。

但是我可以用 ocamlbuild 用最简单的 _tags 文件成功编译这个程序: : pkg_batteries, package(batteries), package(num)

魔法在哪里?如何像 ocamlbuild 一样使用 Makefile 进行编译?

编辑:我找到了解决方案。我实际上有两个版本的电池(1.4 和 2.2),ocamlfind 在命令行上给出了 2.2 版本,在 ocamlbuild 上给出了 1.4。我不知道为什么。我相信早期版本的电池没有重新定义模块 Num(但您必须使用 BatNum),因此旧版本不会出现问题。感谢您的回答。

【问题讨论】:

    标签: ocaml ocaml-batteries


    【解决方案1】:

    你使用什么命令构建它?因为如果你没有指定构建target(即你的命令是ocamlbuild a.ml而不是ocamlbuild a.ml a.native)它会看起来好像它正在编译,即使它不是。

    当您尝试“ocamlfind ocamlc -package battery a.ml”时,实际发生的情况是 nums 的 + 盖过了 Pervasives 的 +

    您可以使用let a = Pervasives.(+) 4 4;;,或者不要打开Nums,而是使用Nums. 来处理类似的事情。

    【讨论】:

    • 是的,我知道我可以使用 Pervasives.(+),或者在必要时使用 let open Num。我的问题是我的代码可以用 ocamlbuild 编译,但不能在命令行(或 Makefile)上编译。我使用“ocamlbuild -use-ocamlfind a.byte”,它确实产生了一个可执行文件,并且再次“ocamlfind ocamlc -package battery a.ml”给出了一个类型错误。基本上我有一个更大的项目,可以用 ocamlbuild 编译,但我需要切换到 OCamlMakefile,因为这个原因失败了。
    【解决方案2】:

    你可以通过使用你想要的模块名称来引用函数。

    如果您想要来自Pervasives(+),您只需说Pervasives.(+) x y 而不是x + y

    【讨论】:

      【解决方案3】:

      当我遇到这个问题时,我使用的解决方案是打开 Pervasive 以覆盖电池值。

      open Batteries
      open Num
      open Pervasives
      
      let a = 4 + 4;;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-19
        • 2021-02-08
        • 2014-05-19
        • 2020-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多