我想拥有自己的现有模块实现,但要保持与现有模块的兼容接口。我没有现有模块的模块类型,只有一个接口。所以我无法在界面中使用include Original_module
。有没有办法从界面获取模块类型?
示例可以是stdlib中的List
模块。我创建了一个My_list
模块,其签名与List
完全相同。我可以将list.mli
复制到my_list.mli
,但这似乎不太好。
答案 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)