Если вашему модулю A нужен только тип из модуля B и значение отсутствует, вы можете создать moduleB.mli с интерфейсом модуля B и скомпилировать его перед модулем A:
moduleA.ml:
let foo (bar : ModuleB.bar) = bar.baaz
moduleB.mli:
class bar : object
method baaz : int
method buz : int
end
moduleB.ml
class bar =
object(s)
method baaz = 3
method buz = ModuleA.foo s
end
Но если у вас есть круговая зависимость от значения или функции, то простого решения не существует, как, например, для:
moduleA.ml:
let li = [new bar; new bar]
let foo (bar : ModuleB.bar) = bar.baaz
Можно попытаться разорвать такую круговую зависимость, используя общее или изменяемое значение:
moduleA.ml:
let li = [new bar; new bar]
let foo (bar : ModuleB.bar) = bar.baaz
let _ = ModuleB.initB foo
moduleB.ml
let foo = ref (fun x -> (failwith "not initialized" : int))
class bar =
object(s)
method baaz = 3
method buz = !foo s
end
let initB f = foo := f