Дизайн 2 интерактивных модулей в Ocaml - PullRequest
1 голос
/ 13 ноября 2011

Я хотел бы разработать 2 модуля A и B, которые оба имеют свои функции, например: A.compare: A.t -> A.t -> bool, B.compare: B.t -> B.t -> bool.Элементы A и B являются конвертируемыми.Поэтому мне также понадобятся функции a_of_b : B.t -> A.t и b_of_a : A.t -> B.t.У меня вопрос, где я должен определить эти функции?внутри структуры A или B или где-то еще?

Кто-нибудь может помочь?

Edit1: только что исправил некоторые ошибки, основанные накомментарий

Ответы [ 2 ]

1 голос
/ 13 ноября 2011

Это классическая проблема дизайна.В языках ООП это сложно решить элегантно, потому что класс инкапсулирует как определение типа, так и методы, связанные с этим типом.Таким образом, как только у вас есть такая функция, как a_of_b, которая в равной степени относится к двум типам, для нее нет ясного места.

OCaml правильно предоставляет различные языковые механизмы для этих различных потребностей: определения типоввведен с ключевым словом type, а связанные методы собраны в module.Это дает вам большую гибкость при разработке вашего API, но не решает проблему автоматически.

Одна возможность - определить модули A и B, как с их соответствующими типами, так и функциями сравнения.Тогда остается вопрос, куда поставить a_of_b и b_of_a.Вы можете произвольно отдать предпочтение модулю A и определить функции A.to_b и A.of_b.Это то, что стандартная библиотека сделала, когда она поместила to_list и of_list в массив.Этому не хватает симметрии;нет причины не помещать эти функции вместо B.

Вместо этого вы можете стандартизировать использование of_ функций против to_ функций.Допустим, вы предпочитаете to_.Тогда вы бы определили функции A.to_b и B.to_a.Теперь проблема в том, что модули A и B взаимозависимы, что возможно, только если вы определите их в одном файле.

Если у вас будет много функций, которые работают со значениями типа A.t и B.t, тогда, возможно, стоит определить модуль AB и поместить все эти функции в него.Если вам понадобится только два, то дополнительный модуль, возможно, излишний.

С другой стороны, если общее количество функций относительно A и B невелико, вы можете создать только модуль AB с * 1026.*, type b и все связанные методы.Однако это не следует соглашению сообщества OCaml о присвоении типа t в его собственном модуле, и будет сложнее применять функторы Set и Map к этим типам.

1 голос
/ 13 ноября 2011

Вы, вероятно, имеете в виду A.compare: A.t -> A.t -> bool, потому что типы указаны в нижнем регистре.

У вас может быть один модуль AB, который содержит тип для A и тип для B.иметь один модуль AB, содержащий как A & B в качестве подмодулей.

Вы также можете использовать рекурсивные модули и функторы.

...