Ich arbeite derzeit an einer Aufgabe, wo ich einen Binärbaum in Haskell erstellen muss.Verwendung von Ord für Binärbaum
Wir haben die folgende Datentyp-Definition verwenden:
data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Eq,Ord,Show)
Ein Baum mit dem Wert Null ist ein leerer (geordnet) Baum und ein nicht-leerer Baum besteht aus einem Wert, und zwei Teilbäumen.
Ich muss eine Funktion "isOrderedTree" schreiben, die True für einen geordneten Baum und False für einen ungeordneten Baum zurückgibt.
isOrderedTree :: Ord a => Tree a -> Bool
isOrderedTree Nil = True
isOrderedTree (Node x Nil Nil) = True
isOrderedTree (Node x (Node y a b) Nil) = x > y && isOrderedTree (Node y a b) && x > getMax (getValues (Node y a b))
isOrderedTree (Node x Nil (Node y a b)) = y > x && isOrderedTree (Node y a b) && x < getMin (getValues (Node y a b))
isOrderedTree (Node x (Node y a b) (Node z c d)) = x > y && x < z && isOrderedTree (Node y a b) && isOrderedTree (Node z c d) && x > getMax (getValues (Node y a b)) && x < getMin (getValues (Node z c d))
Mein Problem ist, dass die folgende Funktionsaufruf funktioniert nicht:
Die Funktion wird wie folgt definiert
isOrderedTree Nil
ich die folgende Fehlermeldung angezeigt:
Ambiguous type variable ‘a0’ arising from a use of ‘isOrderedTree’ prevents the constraint ‘(Ord a0)’ from being solved.
Probable fix: use a type annotation to specify what ‘a0’ should be.
These potential instances exist:
instance (Ord a, Ord b) => Ord (Either a b)
instance Ord Ordering
instance Ord Integer
Weiß jemand, was ich hier vermisse?
~~ Sie zeigen nicht, wie Sie 'isOrderedTree' zu verwenden versucht haben. – Zeta
Eine Randnotiz: Diese Implementierung ist möglicherweise nicht korrekt, je nachdem, was genau "bestellt" bedeutet. Ist zum Beispiel "Knoten 1 (Knoten 0 Null (Knoten 2 Null Null)) Null" - welcher "2" im "kleineren" Teilbaum des "1" -Knoten hat - geordnet oder nicht? Was sagt deine Funktion für diesen Fall? –
@DanielWagner Danke, ich habe jetzt dieses Problem angesprochen. – Alexander