При использовании взаимно рекурсивных определений модулей в OCaml необходимо давать подписи даже в файле .ml
. Это раздражает, когда я также хочу выставить данный интерфейс из .mli
, так как в итоге я повторяю подпись дважды. : (
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
Это грубое приближение к тому, что я делаю (объекты типа Client
знают Server
, который их создал. Server
s знают Client
s).
Конечно, подписи повторяются в .mli
. Почему это необходимо?
(Примечание: я не жалуюсь, но на самом деле хочу знать, есть ли для этого причина, связанная с теорией типов или "проблемой жесткого компилятора".)