在OCaml中使用相互遞歸模塊定義時,即使在.ml
文件中也需要簽名。這是一個煩惱,我也想暴露.mli
給定的接口,因爲我最終重複簽名兩次。 :(!爲什麼要在OCaml中的相互遞歸模塊中籤名?
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
■正確的Client
S)。
當然,簽名。反覆在.mli
爲什麼這是必要的
(注:我不是在抱怨,但實際上想知道是否有一種理論或「硬編譯器問題」有關的原因)?
這很有道理。事實上,我通過在`.mli`中暴露外部消費者的不同類型簽名來利用這個「特徵」。我應該已經意識到了。 – Ashe 2011-01-21 11:02:39