解决这个问题的标准方法是编写一个函子,给定一个包含 PQ 中包含的类型的模块 + 您给出的比较函数返回一个专门用于该类型和比较函数的新 PQ 模块。
module PriorityQueue (OT : Map.OrderedType) = struct
type t =
| Leaf
| Node of OT.t * t * t
(*Define your functions in terms of OT.compare ...*)
end
然后,您将创建一个具体的 PriorityQueue 模块
module FunnyPQ = PriorityQueue(struct
type t = int
let compare _ _ = pred (Random.int 3)
end)
请参阅 OrderedType 的定义:http: //caml.inria.fr/pub/docs/manual-ocaml-4.00/libref/Map.OrderedType.html
您当然也可以使用您采用的方法,但通过以下方式将数据类型分解为 2 种类型
type 'a pq =
| Leaf
| Node of 'a * 'a pq * 'a pq
type 'a t = {
comp : 'a -> 'a -> int ;
pq : 'a pq
}
请注意,您使用这种方法会失去一些类型安全性,因为现在如果您正在编写一个带有例如签名的函数,'a pq -> 'a pq -> 'a pq
您不能保证第一个 pq 参数和第二个 pq 参数是使用相同的比较函数构造的。