Ash*_*she 9 ocaml module mutual-recursion
在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
Run Code Online (Sandbox Code Playgroud)
这是我正在做的粗略近似(Client类型对象知道Server实例化它们Server.s知道它们的Clients).
当然,签名在重复.mli.为什么这有必要?
(注意:我不是在抱怨,但实际上想知道是否存在类型理论或"硬编译器问题"相关的原因.)
我的猜测:为了编译递归模块,编译器需要类型注释来实现。在 mli 文件(如果您使用任何)中,这些模块的类型可以进一步限制或完全隐藏,因此在一般情况下,编译器期望在 mli wrt 解析类型递归中找到有用的类型是不明智的。