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