组织OCaml项目:文件和模块

时间:2015-04-11 17:03:47

标签: ocaml

我想将我的项目从平面文件/模块层次结构重组为更嵌套的项目。这就是我现在所拥有的:

.                    # 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.mlfruit.ml文件,其中包含必要的子模块:

(* pie.ml *)

module Apple = struct
  include Apple
end

module Lemon = struct
  include Lemon
end

但我不知道如何解决pie/apple.mlfruit/apple.ml之间的歧义。

我尝试研究Core库,其Core命名空间包含嵌套模块Core.BoolCore.Bag等等,但我找不到{{1}我假设在那里整合了所有的子模块。

1 个答案:

答案 0 :(得分:2)

由于在OCaml中引入模块别名,处理此问题的首选方法是:

  • 以明确识别的模块开发模块 具有全球唯一名称。

  • 如果您愿意,可以准备一个模拟命名空间的特殊模块, 对于用户来说,这可能比平面的模块集合更好。

因此,除了您当前的模块定义,您还可以添加

(* Fruit.ml *)
module Apple = Fruit_Apple
module Lemon = Fruit_Lemon

(* Pie.ml *)
module Apple = Pie_Apple
module Lemon = Pie_Lemon

如果合适,您应该考虑添加标识您的库的全局前缀,以便其他库可以提供FruitPie模块而无需与您竞争。