我想在我的源代码树的不同目录中为两个 .ml 源文件提供相同的名称,但 OCaml 文档指出文件 A.ml 导出为顶层模块 A = struct ... end。如果我有两个文件 X/A.ml 和 Y/A.ml,我如何从 B.ml 引用它们?
2 回答
模块可以包含模块,即您可以有模块的层次结构。从 B.ml 的角度来看,可以看到名为X.A
和的两个模块Y.A
。它们甚至都可以有一个名为 的函数foo
,这些函数将被视为X.A.foo
和Y.A.foo
。
请注意,如果您open
同时使用模块X
和Y
,则A
来自的模块Y
将隐藏A
来自的模块X
。
那是从命名空间的角度来看的。现在,关于源代码树。一种方法是拥有这些文件:
- 毫升
- X/a.ml
- y.ml
- 是/a.ml
文件 x.ml 是自动生成的,仅包含以下内容:
module A = struct
(*The contents of x/a.ml is included here*)
end
同样对于 y.ml 有几个预处理器能够包含一个文件:cpp、camlp4、camlp5、camlmix...
这套自动生成的文件(每次换源都会重新生成)不是很满意,我再看看其他的答案。
你也可以看一下ocamlc -pack
,但是我很久以前尝试过的时候出现了ocamldoc
无法拥有 x/a.ml 和 y/a.ml 的问题。所以在你选择一个工具之前检查一下。
您不能将具有相同名称的模块链接到同一程序中。例如,标准库的扩展,如电池和核心,被迫给标准模块一个不同的名字。在电池中,列表模块称为 BatList。然后,他们提供了一个包装模块 Batteries,在该模块中,该模块通过 do 重命名module List = BatList
。该模块的总体路径是Batteries.List
,因此与标准库的顶层没有冲突List
。最后,使用 Batteries 和 Core 的推荐方法是使用open Batteries
and open Core
,从而使您可以访问模块名称下的其他列表功能List
。
因此,唯一的选择是重命名你的模块,但你可以通过两种方式来做到这一点:
更改模块的基本名称,例如称它们为 A 和 B。
将模块放在另一个模块下,例如将它们命名为 XA 和 YA 如果要保留当前目录结构,可以使用 OCaml 的 -pack 选项。就我个人而言,我觉得这个选项限制性太强,最终总是手动打包,即上面描述的电池和核心使用的技术。