gpt4 book ai didi

module - 为什么 OCaml 中的相互递归模块需要签名?

转载 作者:行者123 更新时间:2023-12-03 01:50:55 24 4
gpt4 key购买 nike

在 OCaml 中使用相互递归模块定义时,需要提供签名,即使在 .ml 文件中也是如此。这是一个烦恼,我还想从 .mli 公开给定的接口(interface),因为我最终重复了签名两次。 :(!

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类型对象知道实例化它们的ServerServer知道它们的客户端)。

当然,签名在.mli中重复。为什么这是必要的?

(注意:我不是在提示,而是实际上想知道是否存在类型理论或“硬编译器问题”相关的原因。)

最佳答案

据我所知,这是没有办法解决的。在非常高的层面上,就编译器而言,客户端的类型签名在它知道服务器的类型签名之前是不完整的,反之亦然。原则上,有一种方法可以解决这个问题:编译器可以在编译时交叉引用您的 .mli 文件。但这种方法有缺点:它混合了编译器和链接器的一些职责,并使模块化编译(没有双关语)变得更加困难。

如果您有兴趣,我推荐 Xavier Leroy 的 original proposal对于递归模块。

关于module - 为什么 OCaml 中的相互递归模块需要签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4743596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com