在Haskell中将树用作优先队列
我必须创建一个二叉搜索树,一个名为Person的数据类型,并基本上在树中插入每个人。问题是插入方法有一个优先级类型,它在以下代码中定义:在Haskell中将树用作优先队列,haskell,queue,binary-search-tree,typeclass,Haskell,Queue,Binary Search Tree,Typeclass,我必须创建一个二叉搜索树,一个名为Person的数据类型,并基本上在树中插入每个人。问题是插入方法有一个优先级类型,它在以下代码中定义: class Priorities a where priority :: a -> Int instance Priorities a where priority :: a -> Int 树的每个节点都是一个列表,插入是根据Priorities类中给每个人的优先级编号来完成的(在我的代码中,这个函数称
class Priorities a where
priority :: a -> Int
instance Priorities a where
priority :: a -> Int
树的每个节点都是一个列表,插入是根据Priorities类中给每个人的优先级编号来完成的(在我的代码中,这个函数称为insertTree)
到目前为止,我已经做到了以下几点:
data Tree => Tree a = EmptyTree
| Node a (Tree [a]) (Tree [a]) deriving (Show, Read, Eq)
data Person = Person { name :: a
, age :: a
, handicapped :: a
} deriving (Eq)
这里是我需要帮助的地方,因为我不知道如何才能进行插入。我的意思是,我一开始很好,但是当我到达需要使用优先级值的部分时,我会感到困惑,以便知道我要在哪个节点(这是一个列表)中插入数据
insertTree :: (Ord a) => Priorities priority -> Tree a -> a -> Tree a
insertTree x EmptyTree x = Node x EmptyTree EmptyTree
insertTree x (Node a left right) y
|x == = Node y left right
|x
我想问的另一件事是,如何将数据类型People作为Priorities类的实例。如果我正确理解了您的问题,您的树类型应该是这样的:
data Tree a = EmptyTree
| Node {
nodePriority:: Int,
nodeValues :: [a],
leftChild :: Tree a,
rightChild :: Tree a
} deriving (Show, Read, Eq)
insertTree value (Node p left values right)
| priority value == p = Node p left value right
| priority value < p = Node p left value (insertTree right value)
| otherwise = Node p (insertTree left value) value right
然后insertTree将类似于:
...
insertTree value (Node p values left right) =
| priority value == p = "insert value in values"
| priority value < p = "recurse into left branch"
| otherwise = "recurse into right branch"
最后,要使人成为优先事项的实例,您可以执行以下操作:
instance Priorities Person where
priority p = age p -- I'm using age as an example, but you can put whatever function you want
基本上我的insertTree函数是这样的:
data Tree a = EmptyTree
| Node {
nodePriority:: Int,
nodeValues :: [a],
leftChild :: Tree a,
rightChild :: Tree a
} deriving (Show, Read, Eq)
insertTree value (Node p left values right)
| priority value == p = Node p left value right
| priority value < p = Node p left value (insertTree right value)
| otherwise = Node p (insertTree left value) value right
insertTree值(节点p左值右)
|优先级值==p=节点p左值右
|优先级值
我认为您需要停下来思考一下代码之外的问题,这个数据结构应该如何工作。例如,我不明白为什么需要树中的列表。如果我在树中插入1,2,3,4,5,它应该是什么样子?是不是每个节点都应该有一个优先级相同的值列表?@PedroRodrigues!顺便说一下,类型a->int
的意思与a->int
完全不同。“后者几乎肯定就是你的意思——注意你的大写字母。”卡尔编辑,谢谢!谢谢,我现在明白了@dcarou太好了:)一个问题:如果我想要多个实例,我可以复制“优先级p”部分,然后编写其他东西?@dcarou是的,假设你想让Cat成为优先级的实例,那么你只需转到实例优先级Cat,其中优先级c=…
。很酷的一点是,insertTree可以在不做任何修改的情况下处理CAT,因为它可以处理任何作为优先级实例的数据类型。不,但是在Person实例中,如果我想要更多变量,我该怎么做?别忘了在值列表中插入值。你不会更新值列表,找到要插入值的正确节点时。而不是Node p left value right
(由于value
不是列表,因此不会进行类型检查),您应该将Node p left(value:value)right
。