在OCaml中创建接口的传统方法是什么?通过创建接口文件foo.mli
和实现文件foo.ml
,可以使用单个实现的接口,但是如何为同一个接口创建多个实现?
答案 0 :(得分:9)
您必须使用模块和签名。 .ml
文件隐式定义模块,并.mli
签名。使用显式模块和签名,您可以将签名应用于多个不同的模块。
请参阅在线书“使用OCaml开发应用程序”的this chapter。
答案 1 :(得分:5)
如果您要为同一个签名设置多个实现,请在编译单元内定义签名,而不是作为编译单元,并且(如果需要)类似于模块。标准库中有一个示例:OrderedType
签名,描述具有该类型的类型和比较函数的模块:
module type OrderedType = sig
type t
val compare : t -> t -> int
end
此签名在set.mli
和map.mli
中定义(您可以将其称为Set.OrderedType
或Map.OrderedType
,或者甚至自己写出来:签名是结构性的)。标准库中有几个具有此签名的编译单元(String
,Nativeint
等)。您还可以定义自己的模块,在定义模块时不需要做任何特殊操作:只要它具有名为t
的类型和类型为{{1的compare
的值即可。该模块具有该签名。标准库中有一个稍微详细的示例:t -> t -> int
仿函数构建一个具有签名Set.Make
的模块,因此您可以通过这种方式构建集合。
OrderedType