0

包 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),因此旧版本不会出现问题。感谢您的回答。

4

3 回答 3

0

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

open Batteries
open Num
open Pervasives

let a = 4 + 4;;
于 2014-06-30T09:22:11.603 回答
0

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

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

您可以这样做let a = Pervasives.(+) 4 4;;,或者不打开 Nums,而是Nums.为所有类似的事情做。

于 2014-06-28T21:59:51.353 回答
0

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

如果你想要(+)from Pervasives,你只需说Pervasives.(+) x y而不是x + y

于 2014-06-29T07:38:32.197 回答