【发布时间】:2014-09-04 20:17:13
【问题描述】:
我对 Haskell 中的 BST 有疑问。 我想我在将 Node(Uzel) 中的“关键”变量定义为 Ord 时遇到了问题。但我绝对不知道更多。
不过,如果我曾经将 Tree 类型的“key”参数定义为 Ord,那么它是有效的,并且代码中的每次使用也会获得此信息。
以下代码不完整,但有我在说的东西:
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
非常感谢您的任何想法!
【问题讨论】:
-
您不能将
k类型的变量k与key类型的变量klic进行比较。尝试najdi :: Ord key => key -> Tree key value -> Maybe value作为类型(并记得在某个时候返回一个值)。 -
确实,错误信息表明
key和k必须是同一类型(key ~ k),而GHC 无法证明这一点。 -
如果您在代码中使用英文名称,这个问题对于更多人来说会更清楚。
-
附注,不需要单独的
List key value叶。只有Null会做得很好。哦,请在你的代码中使用英文,99% 的人很难理解List在这里做什么。 -
谢谢大家 - 特别感谢 Pigworker - IJW :)。
标签: haskell binary-search-tree