Неисчерпывающий паттерн в функции Хаскелла

Я написал функцию, которая вставляет элемент в двоичное дерево, но каждый раз, когда я пытаюсь запустить его, я получаю неисчерпывающий шаблон в функции.

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)

Не могли бы вы дать мне несколько советов? Спасибо

3 ответа

Решение

Вы не включили определение того, что происходит, когда дерево, в которое вы вставляете, является 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,

Ошибка, которую я получаю (после добавления некоторых определений в ваш код для компиляции):

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

Который говорит вам, что вам нужно добавить случай, подобный этому:

genTree x Nil = ...

Если вы добавите следующее в начало файла (при условии, что вы используете GHC), он точно скажет вам, где находится любая ошибка "неисчерпывающего шаблона":

{-# OPTIONS_GHC -Wall #-}

Как уже упоминали другие, вы пропускаете дело Нила.

Другие вопросы по тегам