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

Ocaml-如何将类型优先级队列定义为带有|的二叉树?,ocaml,priority-queue,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 *

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

    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) 
我该如何定义它呢?

我认为应该是这样的

type 'a priority_queue =
| Leaf
| Node of 'a priority_queue * ('a * int) * 'a priority_queue
通过在定义
节点
时使用
priority\u queue
,我们可以说左右子节点可以是
或另一个
节点
。不需要在构造函数的定义中浮动任何
|

编辑 如果您希望将不同类型的构造函数的名称彼此分开,那么可以使用模块。一个快速的谷歌搜索结果(讽刺的是)显示了优先级队列示例。特别是,这里有一个简单的模块,包括您的
priority\u队列
类型(基于该链接的第一部分):

模块
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)
我认为应该是这样

type 'a priority_queue =
| Leaf
| Node of 'a priority_queue * ('a * int) * 'a priority_queue
通过在定义
节点
时使用
priority\u queue
,我们可以说左右子节点可以是
或另一个
节点
。不需要在构造函数的定义中浮动任何
|

编辑 如果您希望将不同类型的构造函数的名称彼此分开,那么可以使用模块。一个快速的谷歌搜索结果(讽刺的是)显示了优先级队列示例。特别是,这里有一个简单的模块,包括您的
priority\u队列
类型(基于该链接的第一部分):

模块
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)

如果您感兴趣,OCaml手册的最后一部分是优先级队列的实现,其数据类型与您的数据类型类似——优先级堆


有关sum类型、它们的语法和一些示例的介绍,请参阅优秀的在线书籍。

如果您感兴趣,OCaml手册的第二部分是优先级队列的实现,其数据类型与您的数据类型类似——优先级堆


有关总和类型及其语法和一些示例的介绍,请参阅优秀的在线书籍。

谢谢!这种方法奏效了。它更像是这样的
type'a priority\u queue=| PriorityQueue of Leaf | PriorityQueue of Node of'a priority\u queue*('a*int)*'a priority\u queue
,但我仍然得到一个语法错误,不幸的是,我刚刚意识到Ocaml拒绝了
PriorityQueue
,所以我将其替换为
priority\u queue
。但我不明白你为什么希望
PriorityQueue
出现在联合案例中。AFAIK类型名称不能以Ocaml中的大写字母开头,因此PriorityQueue被拒绝。@akoprowski:是的,这让我大吃一惊-我实际上是用F#编码的,在F#中允许使用大写类型名称。@KenWayneVanderLinde等人-谢谢你的提示!我希望在定义时使用叶/节点的构造函数PriorityQueue,这样我们就不会意外地将常规树与优先级队列混淆。真希望我能找到一个办法。我想这没什么大不了的。谢谢!这种方法奏效了。它更像是这样的
type'a priority\u queue=| PriorityQueue of Leaf | PriorityQueue of Node of'a priority\u queue*('a*int)*'a priority\u queue
,但我仍然得到一个语法错误,不幸的是,我刚刚意识到Ocaml拒绝了
PriorityQueue
,所以我将其替换为
priority\u queue
。但我不明白你为什么希望
PriorityQueue
出现在联合案例中。AFAIK类型名称不能以Ocaml中的大写字母开头,因此PriorityQueue被拒绝。@akoprowski:是的,这让我大吃一惊-我实际上是用F#编码的,在F#中允许使用大写类型名称。@KenWayneVanderLinde等人-谢谢你的提示!我希望在定义时使用叶/节点的构造函数PriorityQueue,这样我们就不会意外地将常规树与优先级队列混淆。真希望我能找到一个办法。我想这没什么大不了的。