在OCaml中,何时使用Interface(mli)以及何时使用模块?

时间:2013-02-13 10:35:16

标签: functional-programming ocaml

OCaml为接口和模块系统提供mli

我的问题很简单,如何从中选择?

2 个答案:

答案 0 :(得分:2)

嗯,一个人,modules are much more powerful。例如,OCaml有Functors(类似于模块级函数)。在解释器输入:

module String_set = Set.Make (String)

它创建一个模块,对字符串集(例如union和intersection)进行操作。

如果仅使用模块的命名空间功能,则创建显式模块可以方便地拥有更深的命名空间。也就是说,模块内部的模块,如:Module1.Module2,可以通过文件module1.ml来实现,它定义了一个名为Module2的模块。

当然每个文件定义一个模块 - 文件m.ml定义模块M - 我发现它们在语法上很方便(因为你没有额外的缩进......)

此外,.mli用于不同的目的:接口文件用于记录顶级定义的类型,这包括模块本身。如果在文件m.ml中定义模块X,则也可以将X的签名放在m.mli中。但.mli文件是可选的,因此即使您希望将模块定义为文件,也不要需要来创建接口文件。

PS:OCaml中的模块功能强大,常见主题是"should I use modules or objects?"。同时检查first class modules是否有额外的魔力。

答案 1 :(得分:1)

访问同一件事只是两种方式

在Bar.ml文件中创建模块Foo时,您必须通过Bar.Foo.function访问它。 如果创建bar.mli,则此文件中定义的所有函数都可以通过Bar.function在语法上访问。其他功能只是实习生。