Вы не можете, насколько я могу судить. Наиболее близким решением является ограничение «рекурсивных» битов тем, что фактически необходимо для выражения каждой сигнатуры в отдельности:
module type AA =
sig
module B : sig type t end
type t
val f : unit -> B.t
end
module type BB =
sig
module A : sig type t end
type t
val g : unit -> A.t
end
А затем уточните, когда вы определите модули:
module rec A : AA with module B = B =
struct
module B = B
type t = int
let f () = B.g ()
end
and B : BB with module A = A =
struct
module A = A
type t = int
let g () = A.f ()
end
FWIW, можно подумать, что должна быть возможность выразить рекурсивные подписи (с большим количеством повторений) с помощью рекурсивных модулей:
module rec AA :
sig
module type T = sig module B : BB.T end
end =
struct
module type T = sig module B : BB.T end
end
and BB :
sig
module type T = sig module A : AA.T end
end =
struct
module type T = sig module A : AA.T end
end
Однако это не работает:
Error: Unbound module type BB.T