Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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/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
Algorithm 具有键值的Haskell二叉树_Algorithm_Haskell_Binary Search Tree - Fatal编程技术网

Algorithm 具有键值的Haskell二叉树

Algorithm 具有键值的Haskell二叉树,algorithm,haskell,binary-search-tree,Algorithm,Haskell,Binary Search Tree,我想用具有元组(k,v)的键值叶构建二叉树 我的代码: data Tree k v = EmptyTree | Node (k, v) (Tree k v) (Tree k v) deriving (Show, Eq, Ord, Read) emptyTree :: (k,v) -> Tree k v emptyTree (k,v) = Node (k, v) EmptyTree EmptyTree treeInse

我想用具有元组(k,v)的键值叶构建二叉树

我的代码:

data Tree k v = EmptyTree 
                | Node (k, v) (Tree k v) (Tree k v)
                deriving (Show, Eq, Ord, Read)

emptyTree :: (k,v) -> Tree k v  
emptyTree (k,v) = Node (k, v) EmptyTree EmptyTree

treeInsert :: (Ord k) => (k,v) -> Tree k v -> Tree k v
treeInsert (k,v) EmptyTree = emptyTree (k, v)
treeInsert (a, b) (Node (k,v) left right) 
        | a == k = (Node (a,b) left right)
        | a < k = (Node (a, b) (treeInsert (a, b) left) right)   
        | a > k = (Node (a, b) left (treeInsert (a, b) right))
但我得到了这个错误:

Couldn't match type `v' with `Int'
      `v' is a rigid type variable bound by
          the type signature for fillTree :: Int -> Tree k v -> Tree k v

原因是什么?我如何修复它?

您的类型要么太笼统,要么太具体。应该是

fillTree :: Int -> Tree Int Int -> Tree Int Int

您的原始声明试图为任何
k
v
(Int,Int)
插入
树kv
。它是说无论你有什么样的树,我们都可以在其中插入一对
Int
s。这显然是胡说八道,正如您对
treeInsert
的签名所示,只有成对的
(k,v)
类型才能插入到
树k v

treeInsert :: (Ord k) => (k, v) -> Tree k v -> Tree k v

或者,类似于
(Ord a)=>a->Tree a a->Tree a a
。在这种情况下,删除类型签名、在GHCi中加载文件并查看编译器认为类型应该是什么可能会有所帮助。
emptyTree
对于该函数来说是一个非常糟糕的名称,每个人都会期望它返回一个
EmptyTree
。更好的名称应该是
singleton
singleNode
fillTree :: (Ord a) => a -> Tree a a -> Tree a a
treeInsert :: (Ord k) => (k, v) -> Tree k v -> Tree k v