2

我写了一个函数,将元素插入二叉树,但每次我尝试运行它时,我都会在函数中得到一个非详尽的模式。

type Eintrag = (Person, Anschrift, SozNr)

data Tree = Nil | Node Eintrag Tree Tree deriving (Eq, Show)

singleton :: Eintrag -> Tree
singleton x = Node x Nil Nil

genTree :: Eintrag -> Tree-> Tree
genTree x (Node e l r)= if ((Node e l r)==Nil)
    then (singleton  x)
    else if (soznr x) < (soznr e )
            then (Node e (genTree x l) r)
            else if (soznr x) > (soznr  e )
                    then (Node e l (genTree x r))
                    else (Node e l r)

你能给我一些提示吗?谢谢

4

3 回答 3

4

您还没有定义当您插入的树是时会发生什么Nil,大概看起来像

genTree x Nil = singleton x

你试图用这条线做到这一点

genTree x (Node e l r) = if (Node e l r == Nil)
    then singleton x
    else ...

但如果你仔细想想,你会发现这是行不通的。模式匹配确保您正在查看的树是形式的Node _ _ _,所以它永远不会Nil。也就是说,if表达式中的测试总是计算为False

于 2013-11-12T21:17:51.623 回答
1

我得到的错误(在您的代码中添加一些定义以使其编译之后)是:

 Warning:
  Pattern match(es) are non-exhaustive
  In an equation for `genTree': Patterns not matched: _ Nil

这告诉您您需要添加这样的案例:

genTree x Nil = ...
于 2013-11-12T21:20:57.490 回答
0

如果您将以下内容添加到文件顶部(假设您正在使用 GHC),它会告诉您任何“非详尽模式”错误的确切位置 -

{-# OPTIONS_GHC -Wall #-}

正如其他人已经提到的那样,您错过了 Nil 案例。

于 2013-11-13T03:56:50.140 回答