程序包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。
但是我能够用ocamlbuild用最简单的_tags文件成功地编译这个程序:<*>:pkg_batteries,package(电池),package(num)
魔力在哪里?如何像ocamlbuild那样使用Makefile进行编译?
编辑:我找到了解决方案。实际上我有两个版本的电池(1.4和2.2),ocamlfind在命令行上给出了2.2版本,在ocamlbuild上给出了1.4版本。我也不知道原因。我相信电池的早期版本没有重新定义模块Num (但你必须使用BatNum),所以这个问题在旧版本中不会出现。谢谢你的回答。
发布于 2014-06-29 05:59:51
你使用的是什么命令构建它?因为如果您没有指定构建目标(例如,您的命令是ocamlbuild a.ml
而不是ocamlbuild a.ml a.native
),即使它不是编译的,它也会看起来像是在编译。
当你尝试"ocamlfind ocamlc -package电池a.ml“时,实际发生的情况是,来自nums的+
盖过了来自Pervasives的+
。
你可以做let a = Pervasives.(+) 4 4;;
,或者不是打开Nums,而是对类似的事情做Nums.
。
发布于 2014-06-29 15:38:32
您可以通过使用所需的模块名称来引用该函数。
如果你想要来自Pervasives
的(+)
,你只需要说Pervasives.(+) x y
而不是x + y
。
发布于 2014-06-30 17:22:12
当我遇到这个问题时,我使用的解决方案是打开Pervasive来覆盖电池的值。
open Batteries
open Num
open Pervasives
let a = 4 + 4;;
https://stackoverflow.com/questions/24471157
复制相似问题