Почему требуется наличие подписей во взаимно рекурсивных модулях в OCaml?

При использовании взаимно рекурсивных определений модулей в 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 . Почему это необходимо?

(Примечание: я не жалуюсь, но на самом деле хочу знать, есть ли причина для этого, связанная с теорией типов или "проблемой жесткого компилятора".)

9
задан Ashe 19 January 2011 в 18:59
поделиться