No se puede, por lo que yo puedo decir. La solución más cercana es la de limitar los bits "recursivos" a lo que realmente se necesita para expresar cada firma por separado:
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
Y luego refinar cuando se definen los módulos:
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, uno podría pensar que debe ser posible expresar firmas recursivas (con mucha repetición) mediante el uso de módulos recursivas:
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
sin embargo, eso no funciona:
Error: Unbound module type BB.T
Gracias por su responda ... 'la solución más cercana es limitar los bits" recursivos "==> ¿Podría explicarnos más sobre los límites de su solución? – SoftTimur
Bueno, esto no permite que usted se exprese recursividad arbitraria entre firmas, porque es necesario para poder aislar un subconjunto autónomo de cada firma como una especie de declaración adelantada. Además, estás repitiendo cada uno de esos subconjuntos en dos lugares, pero nombrarlos y 'incluirlos' puede ayudar. En mi respuesta no me molesté en hacer eso, porque los subconjuntos relevantes (tipo t) son lo suficientemente pequeños. –