2017-09-06 66 views
0

我运行Ubuntu,安装ocaml的,并写了下面的脚本,因为我发现它在一组指令(课程笔记):如何在Ocaml中打开一个模块?

;; open Assert 
;; print_int 1 

将该文件保存为test.ml。然后,在一个端I导航到包含该文件的文件夹,并执行

$ ocaml test.ml 

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

File "test.ml", line 1, characters 8-14: 
Error: Unbound module Assert 

任何人都可以描述这是如何工作?

+0

需要注意的是,你应该写 '开放断言 设()= print_int 1' ,避免'';;干脆。 – ChriS

回答

2

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

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

$ ocamlc -c assert.mli 
$ ocamlc -c assert.ml 

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

之后,如果你运行它,这样你test.ml文件应该工作确定:(感谢@camlspotter)

$ ocaml assert.cmo test.ml 

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

作为一个方面的评论,它是从;;开始你的行风格非常奇怪。该令牌用于告诉OCaml顶层(解释器)它应该评估迄今为止输入的内容。所以它通常会在后面一些有趣的表达。

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

+0

''assert.ml'的目标代码不是'ocaml'自动加载的,因此编译是不够的。 'ocaml assert.cmo test.ml'是必需的。 – camlspotter

+0

(当我尝试它时,它对我有用,但也许我没有尝试使用任何实际的代码,谢谢。) –