如何在 Ocaml 中打开模块?

Add*_*dem 1 ocaml module

我正在运行 Ubuntu,安装了 Ocaml,并编写了以下脚本,正如我在一组说明(课程笔记)中找到的那样:

;; open Assert
;; print_int 1
Run Code Online (Sandbox Code Playgroud)

将此文件另存为test.ml. 然后在终端中,我导航到包含该文件的文件夹并执行

$ ocaml test.ml
Run Code Online (Sandbox Code Playgroud)

包含文件夹具有assert.ml文件和assert.mli. 我查看了这些课程笔记和 Ocaml 网站上的一些文档,除了尝试上述方法之外,找不到任何关于如何打开模块的官方声明。当我运行它时,我收到错误消息

File "test.ml", line 1, characters 8-14:
Error: Unbound module Assert
Run Code Online (Sandbox Code Playgroud)

谁能描述这应该如何工作?

Jef*_*eld 5

如果您只有 assert.ml 和 assert.mli,那么您需要先编译它们,然后才能在其他代码中使用它们。

您可以像这样直接使用 ocaml 编译器:

$ ocamlc -c assert.mli
$ ocamlc -c assert.ml
Run Code Online (Sandbox Code Playgroud)

这将创建名为 assert.cmi(assert.ml 的编译版本)和 assert.cmo(assert.ml 的编译版本)的文件。

之后,如果你像这样运行你的 test.ml 文件应该可以正常工作:

$ ocaml assert.cmo test.ml
Run Code Online (Sandbox Code Playgroud)

(感谢@camlspotter。)

open如果模块之前不可用,OCaml 中的构造不会导致模块变得可用。它的作用是让名字的模块直接可用。如果没有open,您需要在名称前加上模块名称:Module.name。在我看来(由其他一些人共享)最好限制使用open,以避免在您的代码范围内引入太多名称。

作为旁注,以;;.开头的行在风格上非常奇怪。此标记用于告诉 OCaml 顶层(解释器)它应该评估您到目前为止输入的内容。所以它通常出现一些有趣的表达之后。

我个人根本不在;;源文件中使用。我只在将表达式输入到顶层时使用它。

  • `assert.ml` 的目标代码不是由 `ocaml` 自动加载的,因此编译还不够。需要`ocaml assert.cmo test.ml`。 (2认同)