/ / Finde ein Element in einem BST Haskell - Haskell

Finde ein Element in einem BST Haskell - Haskell

Ich schreibe eine Suche nach einem Element-Funktion in BST auf eigene Faust, aber ich stieß auf diesen Fehler, ich bin mir nicht sicher, was es bedeutet (Fehler in der Zeile von x (Empty) = False)

 Occurs check: cannot construct the infinite type: a = Tree a
When generalising the type(s) for `searchTree"

Hier ist, was ich mir ausgedacht habe:

data Tree a = Empty | Node a (Tree a) (Tree a)
deriving (Show, Read, Eq)


searchTree :: (Ord a) => a -> Tree a -> Bool
searchTree x (Empty) = False
searchTree x (Node left y right)
|y == x = True
|y > x = searchTree x left
|y < x = searchTree x right

Antworten:

4 für die Antwort № 1

Du hast Node a (Tree a) (Tree a), aber pattern-match es als (Node left y right). Dies führt zu folgenden Typen: left :: a; y, right :: Tree a. Dann vergleichst du y :: Tree a zu x :: a - Das zwingt sie, den gleichen Typ zu haben, was nur möglich ist, wenn Tree a ist der gleiche Typ wie a. Das ist unmöglich1, unendlicher Typ, beschwert sich GHC.

Die Lösung besteht darin, Ihr Muster zu korrigieren: es sollte sein (Node y left right), um mit dem Datenkonstruktor übereinzustimmen.

1 Es ist ein theoretisch möglicher Typ, nur nicht sehr nützlich. a ~ Tree a kann halten, aber nur wenn a ~ Tree (Tree (Tree (Tree (Tree ...)))).