我正在尝试将优先级队列定义为二叉树,但不断出现语法错误
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)
我该如何定义?
答案 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。