2016-11-11 6 views
0

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?

+1

~~ Sie zeigen nicht, wie Sie 'isOrderedTree' zu ​​verwenden versucht haben. – Zeta

+0

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? –

+0

@DanielWagner Danke, ich habe jetzt dieses Problem angesprochen. – Alexander

Antwort

1

Sie müssen einen konkreten Typ für Nil angeben, auch wenn der bestimmte Typ nicht wichtig ist.

+2

Oder Sie können '-XTypeApplications' von GHC 8 verwenden, wie' isOrderedTree @() Nil' oder 'isOrderedTree @Int Nil'. Es ist kürzer als die explizite Typspezifikation. – Shersh

+0

@chepner Das hat mein Problem gelöst, danke! – Alexander