【问题标题】:Non-exhaustive pattern in function-Haskell函数中的非穷举模式-Haskell
【发布时间】:2013-11-12 21:14:24
【问题描述】:

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

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)

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

【问题讨论】:

    标签: haskell insert binary-tree literate-programming non-exhaustive-patterns


    【解决方案1】:

    你没有定义当你插入的树是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

    【讨论】:

      【解决方案2】:

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

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

      这告诉你需要像这样添加一个案例:

      genTree x Nil = ...
      

      【讨论】:

        【解决方案3】:

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

        {-# OPTIONS_GHC -Wall #-}
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多