Неисчерпывающий паттерн в функции Хаскелла
Я написал функцию, которая вставляет элемент в двоичное дерево, но каждый раз, когда я пытаюсь запустить его, я получаю неисчерпывающий шаблон в функции.
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 #-}
Как уже упоминали другие, вы пропускаете дело Нила.