www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Dogge

Gepostet:
28.05.2013 22:22

Matching-Problöem mit Maybe (a, BinTree a)  
Hallo, die Funktion geht den binären Baum links runter bis ein Teilbaum (links) Empty ist. Dann muss der Knoten, bei dem der Teilbaum Empty wurde, zurückgegeben werden.Das in einer Klammer ->(a, ). Der Baum ohne diesen entsprechenden Knoten muss auf der rechten Seite zurückgegeben werden ->(a, BinTree a). Die Funktion heißt splitleftmost , die das macht. slm speichert die entsprechenden Bäume in eine Baumliste. yugu setzt die Liste zu einem Baum zusammen. Problem : Bei slm kann der compler kein ==, obwohl dies in BinTree mittels deriving Eq sichergestellt ist. Sonst ist der Fehler: Couldn't match expected type `(a, BinTree a)' with actual type `[BinTree a0] -> (a0, BinTree a0)'. Das passt doch, es wird eine Klammer erwartet und auch zurückgegeben. Weshalb der Compiler hier Probleme macht ,weiß ich nicht.

Vielen Dank im Voraus

>data BinTree a = Empty| Node (BinTree a) a (BinTree a)deriving (Eq, Show)

>splitleftmost :: BinTree a -> Maybe (a, BinTree a)
>splitleftmost Empty = Nothing
>splitleftmost (Node l a r) =Just (slm( Node l a r) )


>slm :: ( BinTree a) -> [ BinTree a] -> ( a, BinTree a)
>slm( Node l a r) xs=if ((Node l a r)==(Node Empty a r)) then ( a ,yugu (xs)) else slm l (( Node Empty a r):xs)


>yugu :: [ BinTree a] -> BinTree a
>yugu (( Node l a r):[])= Node l a r
>yugu (( Node Empty d r):( Node Empty s z):xs) = yugu (( Node ( Node Empty s z) d r):xs)



assignment5.lhs:81:37:
Couldn't match expected type `(a, BinTree a)'
with actual type `[BinTree a0] -> (a0, BinTree a0)'
In the return type of a call of `slm'
Probable cause: `slm' is applied to too few arguments
In the first argument of `Just', namely `(slm (Node l a r))'
In the expression: Just (slm (Node l a r))

assignment5.lhs:85:39:
No instance for (Eq a)
arising from a use of `=='
In the expression: ((Node l a r) == (Node Empty a r))
In the expression:
if ((Node l a r) == (Node Empty a r)) then
(a, yugu (xs))
else
slm l ((Node Empty a r) : xs)
In an equation for `slm':
slm (Node l a r) xs
= if ((Node l a r) == (Node Empty a r)) then
(a, yugu (xs))
else
slm l ((Node Empty a r) : xs)
Zum Seitenanfang    
 
Landei

Gepostet:
29.05.2013 09:37

   
Es reicht nicht, an BinTree ein deriving Eq dranzuhängen, denn damit das funktioniert, musst du natürlich auch die Werte im Baum, also "a" vergleichen können. Deshalb musst du das als zusätzlichen Kontext angeben:


slm :: Eq a => ( BinTree a) -> [ BinTree a] -> ( a, BinTree a)


Du hast aber noch ein weiteres Problem in deinem Code. Ich habe grade keine Zeit, es mir genau anzuschauen, aber "Couldn't match expected type `(a, BinTree a)' with actual type `[BinTree a0] -> (a0, BinTree a0)'" schaut so aus, als hättest du vergessen, einer Funktion ein Argument mitzugeben.
Zum Seitenanfang