OCaml为接口和模块系统提供mli
。
我的问题很简单,如何从中选择?
答案 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在语法上访问。其他功能只是实习生。