如何防止OCaml电池超越价值

时间:2014-06-28 21:33:28

标签: ocaml ocaml-batteries

包Batteries.Num会覆盖函数(+),( - ),...所以编译器会对以下简单代码给出错误

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

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

我用“ocamlfind ocamlc -package batteries a.ml”编译。

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

但是我能够使用最简单的_tags文件使用ocamlbuild成功编译该程序:     < *&gt ;: pkg_batteries,package(battery),package(num)

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

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

3 个答案:

答案 0 :(得分:0)

你使用什么命令构建它?因为如果你没有指定一个构建目标(即你的命令是ocamlbuild a.ml而不是ocamlbuild a.ml a.native),它就好像它的编译一样,即使它不是&#39 ;吨

尝试" ocamlfind ocamlc -package battery a.ml"实际上发生了什么?是因为来自nums的+使Pervasives的+黯然失色。

您可以执行let a = Pervasives.(+) 4 4;;,或者不是打开Nums,而是Nums.执行此类操作。

答案 1 :(得分:0)

您可以使用所需的模块名称来参考该功能。

如果您想要来自(+)的{​​{1}},则只需说出Pervasives而不是Pervasives.(+) x y

答案 2 :(得分:0)

我遇到此问题时使用的解决方案是打开Pervasive来覆盖电池值。

open Batteries
open Num
open Pervasives

let a = 4 + 4;;