Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中将树用作优先队列_Haskell_Queue_Binary Search Tree_Typeclass - Fatal编程技术网

在Haskell中将树用作优先队列

在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类中给每个人的优先级编号来完成的(在我的代码中,这个函数称

我必须创建一个二叉搜索树,一个名为Person的数据类型,并基本上在树中插入每个人。问题是插入方法有一个优先级类型,它在以下代码中定义:

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