与OCaml中的多个实现的接口

时间:2012-03-23 17:30:55

标签: interface module ocaml

在OCaml中创建接口的传统方法是什么?通过创建接口文件foo.mli和实现文件foo.ml,可以使用单个实现的接口,但是如何为同一个接口创建多个实现?

2 个答案:

答案 0 :(得分:9)

您必须使用模块和签名。 .ml文件隐式定义模块,并.mli签名。使用显式模块和签名,您可以将签名应用于多个不同的模块。

请参阅在线书“使用OCaml开发应用程序”的this chapter

答案 1 :(得分:5)

如果您要为同一个签名设置多个实现,请在编译单元内定义签名,而不是作为编译单元,并且(如果需要)类似于模块。标准库中有一个示例:OrderedType签名,描述具有该类型的类型和比较函数的模块:

module type OrderedType = sig
  type t
  val compare : t -> t -> int
end

此签名在set.mlimap.mli中定义(您可以将其称为Set.OrderedTypeMap.OrderedType,或者甚至自己写出来:签名是结构性的)。标准库中有几个具有此签名的编译单元(StringNativeint等)。您还可以定义自己的模块,在定义模块时不需要做任何特殊操作:只要它具有名为t的类型和类型为{{1的compare的值即可。该模块具有该签名。标准库中有一个稍微详细的示例:t -> t -> int仿函数构建一个具有签名Set.Make的模块,因此您可以通过这种方式构建集合。

OrderedType