我想写一个类似的集合如下。
signature COMPARABLE_SET=
sig
type 'a set
val empty: 'a set
val insert: 'a * 'a set -> 'a set
val member: 'a * 'a set -> bool
end
我需要将一个集合类型中的元素限制为可比较:(有一个类型为'a * 'a -> order
的函数)。
如何实现它?
答案 0 :(得分:4)
如果你想在OCaml中这样做,这只是一个仿函数案例:
首先,您需要定义元素的类型:
module type OrderedType = sig
type t
val compare : t -> t -> int
end
然后你将在这种类型上定义一个仿函数:
module MakeComparableSet (Ord : OrderedType) :
sig
type elt = Ord.t
type t
val empty : t
val insert : elt -> t -> t
val member : elt -> t -> bool
end = struct
type elt = Ord.t
type t
let empty = failwith "TODO"
let insert = failwith "TODO"
let member = failwith "TODO"
end
究竟是什么here。
您可以将仿函数视为将创建新模块的模块的函数。这里,仿函数ComparableSet采用签名OrderedType的模块并返回一个集合的模块。