2012-05-17 169 views
0

我有问题,在Haskell BST。 我想我已经问题定义的“钥匙”变量节点(Uzel)是奥德。但我绝对没有更多的想法。二叉搜索树,comparsion

我不过,如果我一旦确定了“关键”的说法为树类型奥德,它是有效的,并在代码中每次使用会太获取此信息。

下面的代码是不完整的,但我在谈论的东西:

data (Ord key) => Tree key value = List key value |Uzel (Tree key value) key value (Tree key value) | Null deriving (Show) 

prazdny :: Ord key => Tree key value 
prazdny = Null 

najdi :: (Ord key,Ord k) => k -> Tree key value -> Maybe a 
najdi k Null = Nothing 
najdi k (Uzel levy klic hodnota pravy) = if k < klic 
       then najdi k levy 
       else najdi k pravy 

当试图编译我得到这个:

bvs.hs:9:49: 
Could not deduce (key ~ k) 
from the context (Ord key, Ord k) 
    bound by the type signature for 
      najdi :: (Ord key, Ord k) => k -> Tree key value -> Maybe a 
    at bvs.hs:(8,1)-(11,58) 
    `key' is a rigid type variable bound by 
     the type signature for 
      najdi :: (Ord key, Ord k) => k -> Tree key value -> Maybe a 
     at bvs.hs:8:1 
    `k' is a rigid type variable bound by 
     the type signature for 
     najdi :: (Ord key, Ord k) => k -> Tree key value -> Maybe a 
     at bvs.hs:8:1 
In the second argument of `(<)', namely `klic' 
In the expression: k < klic 
In the expression: if k < klic then najdi k levy else najdi k pravy 

地块感谢您的想法! !

+3

你不能用变量'klic'类型的'key'比较变量'k'类型的'k'。尝试'najdi :: Ord key =>键 - >树键值 - >可能值'作为类型(并记得有时返回一个值)。 – pigworker

+0

事实上,该错误消息表示,'key'和'k'必须是同一类型'(键〜K)'和GHC是无法证明。 – Vitus

+1

如果你在你的代码中使用英文名,这个问题会对更多的人更清楚。 – yairchu

回答

0

评论了这条线,它会编译:

--najdi :: (Ord key,Ord k) => k -> Tree key value -> Maybe a 
+1

请解释为什么* *这就是OP需求去做;提供没有上下文或解释的代码更改无人帮助。 – dimo414

2

的问题是,k和密钥必须以比较它们相同的类型,但你声明它们可能会有所不同,所以编译器抱怨。如果你让它们为相同的类型,它会打字检查。