Работа с круговыми зависимостями в OCaml - PullRequest
14 голосов
/ 30 августа 2008

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

Единственный известный мне способ решения этой проблемы - определить все три типа одновременно:

type defn = ...
and stmt = ...
and expr = ...

Кажется, для этого требуется, чтобы весь код типов был в одном файле. Есть ли способ обойти это? Как вы справляетесь с круговыми определениями в вашем коде?

Ответы [ 3 ]

16 голосов
/ 31 августа 2008

Рекурсивные определения должны появляться в одном файле. Если вы хотите разделить определения, операторы и выражения на отдельные модули, вы можете сделать это, используя рекурсивные модули , но они все равно должны появиться в одном файле. Межфайловые зависимости DAG-ifying - одна из неприятностей OCaml.

14 голосов
/ 19 октября 2008

Это легко решается путем параметризации ваших типов по типам, к которым они относятся:

type ('stmt, 'expr) defn = ...
type ('defn, 'expr) stmt = ...
type ('defn, 'stmt) expr = ...

Эта техника называется «развязывание рекурсивного узла» (в связи с узлом Гордиана) и была описана в статье OCaml Journal .

Ура, Джон Харроп.

5 голосов
/ 17 февраля 2012

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

Единственная проблема заключается в том, что с этим решением вы больше не сможете сопоставлять шаблоны для этих типов вне их реализации.

Лично, но это, вероятно, дело вкуса, мне нравится, когда все типы моей программы определены в одном модуле (я думаю, это помогает в удобочитаемости программы). Таким образом, это ограничение OCaml не является для меня проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...