Ocaml实现

7
我在OCaml中实现数组时遇到了一些小问题。例如,当我在终端(konsole)上输入以下命令:
let tab = Array.make 5 6;

我有。
val tab : int array = [|6; 6; 6; 6; 6|]

作为输出。因此,它创建了一个长度为5的数组,并用6填充了所有情况。好的,我理解了那部分。但是当我在像Kate这样的文本编辑器中键入它,保存并编译它时,我收到了以下错误:
Error: Unbound value Array.make

我不明白为什么在 Kate 编辑器中,Array.make 被当作值,而在终端中它又被当作函数。我使用了 ".ml" 扩展名保存文件,并使用 ocamlc -o test 文件名 进行编译。 请问有什么建议吗?谢谢。
2个回答

5

我使用OCaml 3.12.0,用ocamlc编译您的程序没有问题。

我猜想您在尝试编译时调用了旧版本的编译器,也许是在Array.make仍然被称为Array.create时。也许当您安装新版本时,已经覆盖了某些文件(如toplevel),但并没有覆盖编译器等其他文件。为了检查,请比较由ocamlc -vocaml给出的版本。

关于“未绑定值”的消息,在OCaml中,函数是值。实现者没有区分“未绑定值不是函数”和“未绑定值是函数”,但这并不是问题的原因。您的问题原因是Array.make根本没有被绑定。


他们两个都给了我相同的版本。版本号为3.11.2。我不认为我覆盖了任何属于以前版本的文件。我只是在我的电脑上安装了Linux,所以我没有任何以前版本的OCaml。我通过输入ocaml进行验证,它写道ocaml尚未安装,所以我刚刚安装了它...这个版本是3.11.2。我尝试使用Array.create,但我仍然遇到同样的问题。你认为这是因为我正在使用的版本吗? - mkab
@mktab,它肯定可以在3.11.2版本中工作。版本3.12.0会告诉你是模块“Array”还是其中的函数“make”未绑定,这是该版本带来的许多小改进之一,但你得到的错误仍然是一个谜。 - Pascal Cuoq
2
@mktab 可能编译器找不到文件.../lib/ocaml/array.cmi。可能是缺失了该文件,或者你的发行版包未正确准备,将文件复制到了编译器配置的安装目录之外的位置。如果是这种情况,你可以使用选项-I和-L来修复它,但我建议从源代码重新编译OCaml。 - Pascal Cuoq
如果缺少它,那将是奇怪的;这难道不意味着顶层调用也无法工作吗?尽管如此,我确实怀疑环境变量或安装出现了严重问题。 - nlucaroni

3
我找到了错误。这是一个非常愚蠢的错误。我将文件保存为“array.ml”。因此,在编译过程中,它创建了一个array.cmi文件,我认为它有点混淆了在.../lib/ocaml/array.cmi中找到的文件。我不是很确定。所以我将文件重命名为“table.ml”,然后它就完美地编译了。真疯狂,居然会混淆这两个文件。

如何明确指定 ../lib/ocaml/array.cmi 呢? - updogliu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接