在 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
实例化它们的对象。sServer
知道它们Client
的 s)。
当然,签名在.mli
. 为什么这是必要的?
(注意:我不是在抱怨,但实际上想知道是否存在类型理论或“硬编译器问题”相关的原因。)