【问题标题】:Binary search tree in haskell, comparsionHaskell中的二叉搜索树,比较
【发布时间】: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 类型的变量kkey 类型的变量klic 进行比较。尝试najdi :: Ord key =&gt; key -&gt; Tree key value -&gt; Maybe value 作为类型(并记得在某个时候返回一个值)。
  • 确实,错误信息表明keyk 必须是同一类型(key ~ k),而GHC 无法证明这一点。
  • 如果您在代码中使用英文名称,这个问题对于更多人来说会更清楚。
  • 附注,不需要单独的List key value 叶。只有Null 会做得很好。哦,请在你的代码中使用英文,99% 的人很难理解 List 在这里做什么。
  • 谢谢大家 - 特别感谢 Pigworker - IJW :)。

标签: haskell binary-search-tree


【解决方案1】:

问题是 k 和 key 必须是相同的类型才能比较它们,但是你声明它们可能不同,所以编译器会抱怨。如果你让它们的类型相同,它会进行类型检查。

【讨论】:

    【解决方案2】:

    注释掉这一行,它会编译:

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

    【讨论】:

    • 请解释为什么这是OP需要做的;在没有上下文或解释的情况下提供代码更改对任何人都没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2010-12-06
    • 2018-09-15
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多