2015-04-11 5 views
2

Я хотел бы реструктурировать свой проект из плоской иерархии файлов/модулей в более вложенный. Вот то, что я сейчас:Организация проектов 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.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 и так далее, но я не мог найти core.ml там файл, который я предполагаю, объединяющее все подмодулей.

+0

Ядро упаковано в опцию '-pack', так что каждый модуль автоматически окутан в модуль' Core'. То, что вы ищете, это 'std.ml' – ivg

+0

возможный дубликат [Как создать иерархию многоуровневого модуля с (или без) Oasis] (http://stackoverflow.com/questions/28722704/how-to-make -a-многоуровневый-модуль-иерархия-с-или-без оазиса) – ivg

ответ

2

С введением модуля псевдонимами в OCaml предпочтительный способ борьбы с этим заключается в следующем:

  • Разработка модулей в однозначно определенных модулей с глобально уникальными именами.

  • Если вы хотите, подготовьте специальный модуль, имитирующий пространство имен, , которое может быть приятнее для пользователя, чем плоская коллекция модулей.

Таким образом, дополнительно к текущему определению модуля, вы можете добавить

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

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

В случае необходимости, следует рассмотреть вопрос о добавлении глобального префикса идентификации вашей библиотеки, так что другие библиотеки могут предоставлять Fruit и Pie модулей не конкурируя с вашим.