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

Jac*_*ale 5 ocaml functional-programming

OCaml 提供了mli接口和模块系统。

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

dar*_*que 3

嗯,一方面,模块的功能要强大得多。例如,OCaml 有函子(类似于模块级函数)。在解释器中输入:

module String_set = Set.Make (String)
Run Code Online (Sandbox Code Playgroud)

它创建一个对字符串集进行操作(例如并集和交集)的模块。

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

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

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

PS:OCaml 中的模块非常强大,以至于一个常见的话题是“我应该使用模块还是对象?” 。还可以检查一流的模块以增加魔力。