如何从接口获取模块类型?

How to get a module type from an interface?

我想要自己实现现有模块,但要与现有模块保持兼容的接口。我没有现有模块的模块类型,只有一个接口。所以我不能在我的界面中使用 include Original_module 。有没有办法从接口获取模块类型?

标准库中的 List 模块就是一个例子。我创建了一个 My_list 模块,其签名与 List 完全相同。我可以将list.mli复制到my_list.mli,但它看起来不太好。

你可以看看 RWO :如果你想在另一个 mli 文件中包含模块的类型(如 List.mli):

include (module type of List)

在某些情况下,您应该使用

include module type of struct include M end   (* I call it OCaml keyword mantra *)

而不是

include module type of M

因为后者放弃了数据类型与其在 M 中定义的原始数据类型的相等性。

可以通过ocamlc -i xxx.mli观察到差异:

include module type of struct include Complex end

具有以下类型定义:

type t = Complex.t = { re : float; im : float; }

表示t是原来Complex.t的别名。

另一方面,

include module type of Complex

type t = { re : float; im : float; }

如果没有与 Complex.t 的关系,它会变成与 Complex.t 不同的类型:如果没有 include hack,您不能混合使用原始模块和扩展版本的代码。这通常不是你想要的。