首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何防止OCaml电池重写值

如何防止OCaml电池重写值
EN

Stack Overflow用户
提问于 2014-06-29 05:33:28
回答 3查看 130关注 0票数 0

程序包Batteries.Num覆盖函数(+)、(-)、...因此,编译器会在以下简单代码中给出错误

代码语言:javascript
运行
复制
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),所以这个问题在旧版本中不会出现。谢谢你的回答。

EN

回答 3

Stack Overflow用户

发布于 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.

票数 0
EN

Stack Overflow用户

发布于 2014-06-29 15:38:32

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

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

票数 0
EN

Stack Overflow用户

发布于 2014-06-30 17:22:12

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

代码语言:javascript
运行
复制
open Batteries
open Num
open Pervasives

let a = 4 + 4;;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24471157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档