https://facebook.github.io/reason/modules.html#modules-basic-modules
I don’t see any import or require in my file; how does module resolution work?
Reason/OCaml doesn’t require you to write any import; modules being referred to in the file are automatically searched in the project. Specifically, a module Hello asks the compiler to look for the file hello.re or hello.ml (and their corresponding interface file, hello.rei or hello.mli, if available).
A module name is the file name, capitalized. It has to be unique per project; this abstracts away the file system and allows you to move files around without changing code.
我尝试过推理模块系统,但无法理解它是如何工作的。
1)open
和include
之间的差异是什么?
2)我的文件foo.re
包含已定义的模块Foo
。我有文件bar.re
,想要从模块Foo
调用函数。
open
我应该include
或Foo
模块bar.re
吗?或者直接访问 - Foo.someFunction
?
3)模块接口应该只实现*.rei
个文件?模块接口文件应该具有相同的名称,但rei
分机?
答案 0 :(得分:11)
1)open
与import
类似,它将打开的模块中的导出定义添加到本地名称空间。 include
将它们添加到模块,就像您将定义从包含的模块复制到includee一样。因此,ìnclude
也会导出定义(除非有接口文件/签名限制当然导出的内容)
2)您应该更喜欢最方便的模块的本地使用,以免不必要地污染命名空间。因此,通常您希望使用直接访问,并且只有在模块专门设计为在文件级别打开时才应该这样做。但是open
的形式比文件级更本地化。您可以open
仅在函数范围内的模块,或者甚至以Foo.(someFunction 4 |> otherFunction 2)
3)Toplevel(文件)模块必须以rei
文件的形式实现,其名称与re
文件相同。但是,您可以将模块类型定义为"接口"对于子模块。
OCaml的模块系统非常广泛和灵活。我建议阅读Real World Ocaml的模块章节以更好地掌握它:https://realworldocaml.org/v1/en/html/files-modules-and-programs.html