包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),所以旧版本不会出现问题。谢谢你的回答。答案 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;;