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