如何防止OCaml电池覆盖值

如何防止OCaml电池覆盖值,ocaml,ocaml-batteries,Ocaml,Ocaml Batteries,程序包batters.Num覆盖函数(+),(-)。。。因此编译器在下面的简单代码中给出了一个错误 open Batteries open Num let a = 4 + 4;; 文件“a.ml”,第3行,字符8-9: 错误:此表达式的类型为int,但表达式的类型应为int batters.Num.Num=Num.Num 我使用“ocamlfind ocamlc-package batters a.ml”编译 编辑:我知道我可以使用渗透剂。(+)或者只在本地打开Num 但我能够使用最简单的标记

程序包batters.Num覆盖函数(+),(-)。。。因此编译器在下面的简单代码中给出了一个错误

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

我使用“ocamlfind ocamlc-package batters a.ml”编译

编辑:我知道我可以使用渗透剂。(+)或者只在本地打开Num

但我能够使用最简单的标记文件ocamlbuild成功编译此程序: :包装电池,包装(电池),包装(数量)

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


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

您正在使用什么命令构建它?因为如果您没有指定生成目标(即,您的命令是
ocamlbuild a.ml
而不是
ocamlbuild a.ml a.native
),它将显示为编译,即使它不是

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


你可以做
让a=渗透物。(+4
,或者不打开Nums,而是执行
Nums.
执行类似操作。

您可以使用所需的模块名称引用函数


如果你想从
pervisives
获得
(+)
,你只需说
pervisives(+)
,而不是
x+y
,当我面对这个问题时,我使用的解决方案是打开pervisives来覆盖电池值

open Batteries
open Num
open Pervasives

let a = 4 + 4;;

是的,我知道我可以使用渗透剂。(+),或者在必要的时候使用let open Num。我的问题是,我有一个代码可以用ocamlbuild很好地编译,但不能在命令行(或Makefile)上编译。我使用“ocamlbuild-use ocamlfind a.byte”生成一个可执行文件,而“ocamlfind ocamlc-package batters a.ml”再次给出一个类型错误。基本上,我有一个更大的项目,可以用ocamlbuild编译,但是我需要切换到OCamlMakefile,因为这个原因,它失败了。