我已经实现了优先级队列,效果很好。以下是我的类型定义。
type 'a t = | Leaf of ('a -> 'a -> int)
| Node of 'a * 'a t * 'a t * ('a -> 'a -> int)
我的想法是树采用比较器功能('a - >'a - > int)并产生'a t,它将由比较器排序。
但是,我在每个Leaf和Node上都有比较器,我想知道是否有更好的方法
具体来说,给定一棵树,我希望能够轻松访问其比较器。而且我不知道如果没有在树的每个Node和Leaf上使用比较器,我是否可以这样做。
由于
答案 0 :(得分:4)
解决这个问题的标准方法是编写一个给出的仿函数 包含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参数是使用相同的方式构造的比较功能。