www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

rikner

Gepostet:
02.12.2007 16:06

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    
 
Jacke

Gepostet:
02.12.2007 19:52

   
Hallo erstmal herzlich willkommen,

hier mal ein kleines Beispiel wie du auf Sachen prüfen kannst:


test ((a,b) : xs)
| xs == [] = [(a,b)]
| a == 1 = test xs


wenn a 1 ist wirds rausgeschmissen Smilie

gruß jacke




Zum Seitenanfang    
 
Siracusa

Gepostet:
02.12.2007 21:50

   
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]
alleKleinerX x liste = filter (istKleinerX x) liste

istKleinerX :: Int -> Int -> Bool
istKleinerX x y
| y < x = True
| otherwise = False

-- Aufruf: alleKleinerX 5 [1..10]
-- Ergebnis: [1,2,3,4]

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    
 
Phenol

Gepostet:
07.12.2007 02:52

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    
 
Siracusa

Gepostet:
07.12.2007 04:08

   
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    
 
Phenol

Gepostet:
07.12.2007 04:26

   
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    
 
Siracusa

Gepostet:
07.12.2007 18:39

   
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    
 
Phenol

Gepostet:
07.12.2007 18:51

   
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