如何从界面获取模块类型?

时间:2016-05-18 13:07:48

标签: ocaml

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

示例可以是stdlib中的List模块。我创建了一个My_list模块,其签名与List完全相同。我可以将list.mli复制到my_list.mli,但这似乎不太好。

2 个答案:

答案 0 :(得分:8)

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

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黑客的扩展版本混合代码。这通常不是你想要的。

答案 1 :(得分:3)

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

include (module type of List)