www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

arnold74

Gepostet:
30.05.2010 09:41

Liste von Tuples in Liste suchen  
Hallo,
nun bin beim Versuch die Hülle zu implementieren, dabei stoße ich auf folgendes Problem. Ich möchte ein Tuple in einer Liste von Liste suche und überprüfen ob es dort vorhanden ist. Das Problem ist dabei dass das erste Element vom Tuple nicht berücksichtigt werden soll. Also folgendes
Habe ein Tuple = (Int, Int,Variable,[Symbol],Symbol) und eine Liste [[(Int,Int,Variable,[Symbol],Symbol)]]. Ich möchte nun überprüfen ob dieses Tuple in dieser Liste vorhanden ist. Mit Concat könnte ich eine einfache Liste machen, aber wie mache ich dass beim Vergleich der erste Int-Value nicht berücksichtigt wird. So eine Art PatternMatching beim Vergleichen: (_,Int,Variable,[Symbol],Symbol)==.. (das wird aber leider so wohl nicht funktionieren.

danke
arnold
Zum Seitenanfang    
 
Siracusa

Gepostet:
30.05.2010 18:07

   
Hallo,

da müsstest du dir eine neue Funktion schreiben die das über Pattern-Matching entsprechend vergleicht, oder ein filter mit einer speziellen Filterfunktion, die nur die "gleichen" rausfiltert und hinterher schauen, ob die Liste nicht leer ist.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
arnold74

Gepostet:
30.05.2010 18:22

   
Hallo,
danke für deine Geduld, habe es hinbekommen. Leider habe ich ein für mich unverständliches Problem beim Verketten von Listen: hier ein Ausschnitt aus meinem Code

goforward::[Production]->[LRState]->[LRState]
goforward prod x@(a@(q,i,v,symb,s):[]) | (length symb == i) = []
| otherwise = goforward' prod a
goforward prod (a@(q,i,v,symb,s):rest) | (length symb == i) = goforward prod rest
| otherwise = goforward' prod a

goforward'::[Production]->LRState->[LRState]
goforward' prod (q,i,v,symb,s) = [(q+1,i+1,v,symb,(symb)!!i)]++[(q+1,i+1,v,symb,(symb)!!i)] --goforward'' prod (q+1)(i+1)((symb)!!i )

goforward''::[Production]->Int->Int->Symbol->[LRState]
goforward'' prod q i s = extendstate q i s (startwith_x s (conv prod))

Der für mich nicht erklärbare Teil ist goforward'. Dort soll LRState = (Int,Int,Variable,[Symbol],Symbol) eine weiter Liste von LRStates hinzugefügt werden. Leider passiert das nicht. Deshalb habe ich testhalber, wie Du siehst [(q+1,i+1,v,symb,(symb)!!i)] zweimal angeführt und den Rest mal auskommentiert. Als Ausgabe erhalte ich
(3,3,"Z",[E,+,T],T)
(2,2,"Z",[E,+,T],+)
(1,1,"Z",[E,+,T],E)
(0,0,"Z",[E,+,T],Z)
, jedoch sollte jedoch diese doppelt angeführt werden . Dieser Code wird ausgeführt, denn ich habe das !!i durch !!0 ersetzt und schon scheint am Ender immer E auf. Ist sicherlich wieder etwas logisches, aber im GHCi ist doch auch [(1,2)]++[(1,2)] auch [(1,2),(1,2)]... irgendwie sitze ich nun 3 Stunden vor diesem an sich trivialen Problem. Sch..... Haskell!!!!!
danke
arnold

Zum Seitenanfang    
 
Siracusa

Gepostet:
30.05.2010 19:59

   
Also goforward' funktioniert sicher richtig, teste es mal im GHCi dann bekommst du auch zwei Werte als Ausgabe. Wenn du dir sicher bist, dass goforward' aufgerufen wird, kann ich nur spekulieren, dass irgendwo an anderer Stelle doppelte Ergebnisse weggefiltert werden (z.B. mit nub).
Zum Seitenanfang    
 
arnold74

Gepostet:
01.06.2010 08:43

Probleme mit map  
Zuerst danke für den Hinweis zu ++, Du hattest wieder mal Recht.
Nun habe ich aber ein Problem mit map und mir ist leider nicht klar, warum hier eine Fehlermeldung kommt. Zuerst mein Problem: Ich habe ein Liste von Produktionen und eine Liste von Symbolen und ich möchte all dieser Produktionen mit den Symbolen überprüfen und entsprechend einen Schritt weiterwandern. Hier mein Code:

goto::[Production]->[LRState]->[Symbol]->[LRState]
goto prod (x@(a@(q,i,v,symb,s):rest)) relsymb =List.nub$ concat $ (map goto' x) relsymb


goto'::[LRState]->Symbol->[LRState]
goto' [] _ = []
goto' x@(act@(q,i,v,symb,s):[]) n | ((symb)!!i)==n =[(q+1,i+1,v,symb,(symb)!!i)]
| otherwise= []
goto' x@(act@(q,i,v,symb,s):rest) n | ((symb)!!i)==n =[(q+1,i+1,v,symb,(symb)!!i)]
| otherwise =goto' rest n


Das Problem liegt bei map! relsymb enthält die Liste der Symbole. Wieso kann ich nicht goto' aufrufen? Ich mache doch eine Map einer Funktion auf eine Liste und in der Funktion goto' wird ja dann jedes einzelne Symbol auf alle Produktionen angewandt!

Bekomme folgende Fehlermeldung:
SlrAutomata.hs:244:77:
Couldn't match expected type `[LRState]'
against inferred type `(Int, Int, Variable, [Symbol], Symbol)'
Expected type: [[LRState]]
Inferred type: [LRState]
In the second argument of `map', namely `x'
In the second argument of `($)', namely `(map goto' x) relsymb'

danke,
Arnold
Zum Seitenanfang    
 
Siracusa

Gepostet:
01.06.2010 19:35

   
Hallo,

map :: (x -> y) -> [x] -> [y], goto' :: [LRState] -> Symbol -> [LRState], x :: [LRState]. Dann wäre der Typ von map goto' :: [[LRState]] -> [Symbol -> [LRState]]. Da passt der erste Parameter nicht mit x zusammen. Außerdem bekommst du eine Liste von Funktionen, ich denke du willst eher map (goto' x) :: [Symbol] -> [[LRState]].


Viele Grüße,

Siracusa
Zum Seitenanfang