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