我想将我的项目从平面文件/模块层次结构重组为更嵌套的项目。这就是我现在所拥有的:
. # Modules:
├── fruit_apple.ml # Fruit_apple
├── fruit_lemon.ml # Fruit_lemon
├── pie_apple.ml # Pie_apple
└── pie_lemon.ml # Pie_lemon
这是我想要的:
. # Modules:
├── fruit
│ ├── apple.ml # Fruit.Apple
│ └── lemon.ml # Fruit.Lemon
└── pie
├── apple.ml # Pie.Apple
└── lemon.ml # Pie.Lemon
OCaml具有从文件名到模块名称的自动映射,但它似乎没有一个用于目录和嵌套文件。
我可以有一个pie.ml
和fruit.ml
文件,其中包含必要的子模块:
(* pie.ml *)
module Apple = struct
include Apple
end
module Lemon = struct
include Lemon
end
但我不知道如何解决pie/apple.ml
和fruit/apple.ml
之间的歧义。
我尝试研究Core库,其Core
命名空间包含嵌套模块Core.Bool
,Core.Bag
等等,但我找不到{{1}我假设在那里整合了所有的子模块。
答案 0 :(得分:2)
由于在OCaml中引入模块别名,处理此问题的首选方法是:
以明确识别的模块开发模块 具有全球唯一名称。
如果您愿意,可以准备一个模拟命名空间的特殊模块, 对于用户来说,这可能比平面的模块集合更好。
因此,除了您当前的模块定义,您还可以添加
(* Fruit.ml *)
module Apple = Fruit_Apple
module Lemon = Fruit_Lemon
(* Pie.ml *)
module Apple = Pie_Apple
module Lemon = Pie_Lemon
如果合适,您应该考虑添加标识您的库的全局前缀,以便其他库可以提供Fruit
和Pie
模块而无需与您竞争。