Gepostet: |
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 | |||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||
Gepostet: |
|||||||||||
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
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 | |||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||
Gepostet: |
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:
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 | |||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||