Я не знаком с Reason, но в OCaml можно было бы делать такие вещи, используя взаимно рекурсивный модуль, как в следующем минимальном примере.
Использование взаимно рекурсивных требований определяет тип их модуля:
module type NoteSig = sig
type t
end
module type TodoSig = sig
type t
end
и фактические модули:
module rec Note : NoteSig = struct
type t = {
todo: Todo.t
}
end
and Todo : TodoSig = struct
type t = {
notes: Note.t array
}
end
Если вы предпочитаете, чтобы оба модуля были в отдельном файле, вы можете сделать почти то же самое, используя функторы (все еще используя сигнатуры модулей, скажем, в файле sig.ml ):
a.ml:
module Note (T:Sig.TodoSig) = struct
type t = {
todo: T.t
}
end
b.ml:
module Todo (N:Sig.NoteSig) = struct
type t = {
notes: N.t array
}
end
Теперь вы можете создавать экземпляры своих модулей в другом файле:
c.ml:
module rec NoteImpl = (A.Note(TodoImpl):NoteSig)
and TodoImpl = (B.Todo(NoteImpl):TodoSig)
Я могу только предположить, что в Reason есть способ сделать то же самое, возможно, добавив много скобок повсюду. Надеюсь, это поможет.