OCaml 提供mli
了接口和模块系统。
我的问题很简单,如何从中选择?
好吧,一方面,模块更强大。例如,OCaml 有 Functor(类似于模块级函数)。在解释器中输入:
module String_set = Set.Make (String)
它创建一个对字符串集(例如并集和交集)进行操作的模块。
如果您只使用模块的命名空间功能,则创建显式模块可以方便地使用更深的命名空间。也就是说,模块中的模块,例如:Module1.Module2,可以通过定义名为 Module2 的模块的文件 module1.ml 来实现。
当然,每个文件都定义了一个模块 - 文件 m.ml 定义了模块 M - 我发现它们在语法上很方便(因为你没有额外的缩进......)
此外,.mli 有不同的用途:接口文件用于记录顶级定义的类型,这包括模块本身。如果您在文件 m.ml 中定义模块 X,您也可以将 X 的签名放入 m.mli 中。但是 .mli 文件是可选的,因此即使您更喜欢将模块定义为文件,也不需要创建接口文件。
PS:OCaml 中的模块非常强大,以至于一个常见的话题是“我应该使用模块还是对象?” . 还要检查一流的模块是否增加了魔力。
这只是访问同一事物的两种方式
当您在文件 Bar.ml 中创建模块 Foo 时,您必须通过 Bar.Foo.function 访问它。如果您创建 bar.mli,则此文件中定义的所有函数都可以通过 Bar.function 在语法上访问。其他职能只是实习生。