组织OCaml项目:文件和模块

3
我想将我的项目从平面文件/模块层次结构重构为更嵌套的层次结构。这是我现在拥有的:
.                    # 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.mlfruit/apple.ml 之间的歧义。
我尝试研究 Core 库,它有一个嵌套模块的 Core.BoolCore.Bag 等等,但我找不到一个 core.ml 文件,我本以为它会集成所有子模块。

核心使用-pack选项进行打包,以便每个模块自动封装在Core模块中。你要找的是std.ml - undefined
1个回答

2

自从OCaml引入模块别名以来,处理这种情况的首选方法是:

  • 开发具有全局唯一名称的明确标识的模块。

  • 如果您希望,可以准备一个特殊的模拟命名空间的模块,这可能比一组扁平的模块更好用。

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

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

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

如果适合的话,您应该考虑添加一个全局前缀来标识您的库,这样其他库就可以提供FruitPie模块而不会与您的库发生冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接