When using mutually recursive module definitions in OCaml, it's necessary to give signatures, even in the .ml
file. This is an annoyance where I also want to expose a given interface from the .mli
, as I end up repeating the signature twice. :(!
module rec Client : sig
type ('serv,'cli) t
(* functions ... *)
end = struct
type ('serv,'cli) t =
{ server: ('serv,'cli) Server.t
; (* other members ... *)
}
end
and Server : sig
type ('serv,'cli) t
(* functions ... *)
end = struct
type ('serv,'cli) t =
{ mutable clients: ('serv,'cli) Client.t list
; mutable state: 'serv
}
(* functions again ... *)
end
This is a rough approximation of what I'm doing (Client
type objects know the Server
that instantiated them. Server
s know their Client
s).
Of course, the signatures are repeated in the .mli
. Why is this necessary?
(Note: I'm not complaining, but actually want to know if there's a type-theory or "hard compiler problem"-related reason for this.)
.mli
; I should've realised. – Tsarevitch