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,这样我们就不会意外地将常规树与优先级队列混淆。真希望我能找到一个办法。我想这没什么大不了的。