如何从接口获取模块类型?
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,您不能混合使用原始模块和扩展版本的代码。这通常不是你想要的。
我想要自己实现现有模块,但要与现有模块保持兼容的接口。我没有现有模块的模块类型,只有一个接口。所以我不能在我的界面中使用 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,您不能混合使用原始模块和扩展版本的代码。这通常不是你想要的。