Gepostet: |
Prüfen, ob Elemente in einer Liste? | ||||||||||
Hallo ich habe grad erst mit Haskell angefangen und ich stecke bei einer Aufgabe fest, da ich nicht weiss wie man prüfen kann ob sich ein bestimmtes Element in einer gegebenen Liste befindet. Die Aufgabenstellung beinhaltet, dass ich aus einer Liste mit Tupeln, die Tupel löschen muss, deren erste Stelle bereits in einem anderen Tupel in der Liste vorkommen und dessen zweite Stelle größer ist als die des ersten Tupels ist: Bsp: red::[(Int,Int)]->[(Int,Int)] red [(2,3),(1,6),(2,1),(1,7)] muss als Ergebnis [(1,6),(2,1)] haben, da (2,3) und (1,7) herausgestrichen werden müssen. Also mein Problem ist, dass ich nicht weiss wie ich prüfen kann, ob sich ein Element in der Liste befindet, dass oben genannte Bedingungen erfüllt (verglichen mit z.b. dem ersten Element der Liste) |
|||||||||||
Zum Seitenanfang | ICQ | ||||||||||
Gepostet: |
|||||||||||
Hallo erstmal herzlich willkommen, hier mal ein kleines Beispiel wie du auf Sachen prüfen kannst:
wenn a 1 ist wirds rausgeschmissen gruß jacke |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Hallo, die Funktion filter könnte dir vielleicht auch bei deiner Aufgabe helfen. Sie bekommt als erstes Element eine Funktion p :: a -> Bool, die zu einem beliebigen Typ a einen Wahrheitswert bestimmt. Das zweite Argument ist eine Liste l mit Elementen desselben Typs. Als Ergebnis wird eine Liste zurückgegeben, die alle Elemente aus l enthält, für die die Funktion p True liefert. Ein Beispiel: alleKleinerX :: Int -> [Int] -> [Int] istKleinerX wird partiell auf x angewendet und liefert somit eine Funktion vom Typ Int -> Bool, die dann der filter-Funktion übergeben werden kann. Für istKleinerX könntest du dann eine Funktion schreiben, die zwei Tupel übergeben bekommt und entscheidet, ob das zweite gelöscht werden kann, oder nicht. Die alleKleinerX-Funktion müßte dann auch entsprechend umgeschrieben werden. Sie könnte z.B. alle Elemente der Ausgangsliste zurückgeben, die für ein spezielles Paar auf jeden Fall gelöscht werden können. Viele Grüße, Siracusa |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
aus eigener liste löschen | ||||||||||
Hallo zusammen, ich habe ein ähnliches problem und weiß nicht wie ich es lösen soll. also ich habe eine einfache liste ... aus dieser soll ich ein element löschen das ich angeben soll delete e Empty = Empty delete e (A l n) = if e==n then A l else delete e l so sieht meine überlegung bis jetzt aus, das funktioniert aber nicht delete ist über delete :: Int -> Slist -> Slist definiert kann mir jemand helfen? |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Hallo Phenol, dein Ansatz ist ja schonmal nicht schlecht. Der Datentyp Slist dürfte in etwa so aussehen: data Slist = Empty | A Slist elem_typ. Hast du in deiner Liste das Element gefunden, das gelöscht werden soll, willst du ja dieses Element wegwerfen und die Restliste zurückgeben. In deiner delete-Funktion sollte dann also l zurückgegeben werden, nicht A l. Denn A l würde als zweiten Parameter wieder einen Wert n' erwarten. Du wirfst also nicht nur das n aus der Liste, sondern den ganzen Knoten A, in dem das n enthalten ist. Außerdem soll der vordere Teil der alten Liste nicht zerstört werden, wenn du das Element noch nicht gefunden hast. Die delete-Funktion muß also im else-Zweig die alte Listenstruktur wiederherstellen, d.h. wieder einen Knoten A mit dem Element n und der rekursiv bearbeiteten Restliste anlegen. Viele Grüße, Siracusa |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
hallo danke erstmal für die schnelle antwort, also ich kann das nicht ganz nachvollziehen... ich habe mir das inzwischen so gedacht, hierbei habe ich nur das problem das alle elemente die vor dem eigentlich zu löschendem element auch gelöscht werden :/ so ganz weiß ich nicht wie ich das hinbekomme? delete e Empty = Empty delete e (A l n) = if e==n then l else delete e l |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Also wenn du auf der linken Seite der Funktion in der Musteranpassung (A l n) schreibst, zerlegst du die Originalliste ja in eine Restliste l und das Element n. Auf der rechten Seite verwendest du nur noch die modifizierte Restliste. Der Knoten A, der l und n zusammenknüpft, wird einfach aufgelöst. Was du eigentlich willst, ist auf der rechten Seite aber die Originalliste mit der modifizierten Restliste zu verwenden. Deshalb legst du den vorher aufgelösten Knoten wieder mittels (A l' n) an. l' stellt jetzt die modifizierte Restliste dar, also den rekursiven Aufruf von delete. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
ahja klar, also wäre der Ausdruck dann hinter dem else (A (delete e l) n) ... cool danke für die Hilfe, ich glaube langsam verstehe ich Haskell | |||||||||||
Zum Seitenanfang | |||||||||||