Ocaml-如何使用|?将类型优先级队列定义为二叉树

时间:2011-12-14 05:33:53

标签: ocaml priority-queue

我正在尝试将优先级队列定义为二叉树,但不断出现语法错误

    type 'a priority_queue = PriorityQueue of (Leaf | Node of 'a priority_queue * ('a*int) * 'a priority_queue)

我这样做时也出错了

type 'a priority_queue = (PriorityQueue of Leaf) | (PriorityQueue of Node of 'a priority_queue * ('a*int) * 'a priority_queue) 

我该如何定义?

2 个答案:

答案 0 :(得分:6)

我认为应该是

type 'a priority_queue =
| Leaf
| Node of 'a priority_queue * ('a * int) * 'a priority_queue

在定义priority_queue时使用Node,我们说左右儿童可能是Leaf或另一个Node。在构造函数的定义中不需要任何|浮动。

修改

如果您希望将不同类型的构造函数的名称彼此分开,则可以使用模块。一个快速的谷歌搜索产生了this page,(具有讽刺意味的是)打开了优先队列示例。特别是,这是一个简单的模块,包括您的priority_queue类型(基于该链接的第一部分):

module PriorityQueue =
  struct
    type 'a priority_queue =
    | Leaf
    | Node of 'a priority_queue * ('a * int) * 'a priority_queue
  end

模块PriorityQueue充当其中声明的命名空间。因此,当您希望使用优先级队列时,可以编写如下内容:

let leaf = PriorityQueue.Leaf
let pq = PriorityQueue.Node (PriorityQueue.Leaf, ("Hello from PriorityQueue", 1), PriorityQueue.Leaf)

当然,这真的很冗长,为方便起见,您可以先打开模块:

open PriorityQueue

let leaf = Leaf
let pq = Node (Leaf, ("Hello from PriorityQueue", 1), Leaf)

答案 1 :(得分:4)

如果您感兴趣,OCaml手册的one of the examples是优先级队列的实现,其数据类型与您的数据类型相似 - 优先级堆。

有关和词类型,语法和一些示例的介绍,请参阅优秀在线书籍Type declarations and pattern matching中的Developping applications with Objective Caml