Ich habe Probleme mit "map" und "filter" bei Haskell?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Dein Verständnis von map und filter ist scheinbar Unsinn.

filter nimmt als erstes Argument eine Kondition entgegen, also eine Funktion die ein Listenelement auf einen booleschen Wert (True oder False) abbildet. Als zweites Argument kommt eine Liste, das Ergebnis ist dann die Liste der Elemente aus der Ursprungsliste, die die Bedingung erfüllen.

Beispiel: filter (< 5) [1, 2, 3, 4, 5, 6, 7] ergibt die Liste [1, 2, 3, 4], denn es werden nur Zahlen übernommen, die kleiner als 5 sind.

map hingegen nimmt als erstes Argument eine Funktion entgegen, die ein Element der Liste auf etwas abbildet. Als zweites Argument kommt dann eine Liste und das Ergebnis ist die Liste, die sich ergibt, wenn man die Funktion auf jedes einzelne Element anwendet.

Beispiel: map (* 2) [1, 2, 3, 4, 5] ergibt die Liste [2, 4, 6, 8, 10], denn jeder Listeneintrag wird mit 2 multipliziert.

Man kann nun mit den richtigen Filtern wie im ersten Teil gewünscht bestimmte Zeichen entfernen, mit map alle Leerzeichen auf Unterstriche abbilden usw. Kleines Beispiel:

Ersetze alle a durch b

map (\x -> if x == 'a' then 'b' else x) "abcaadef" ergibt "bbcbbdef"

1
@HansImGlueck178

Danke dir für die ausführliche Darstellung. Wenn ich die Fkt. in den Editor reinsetze und dann in der Shell eingebe

map \a

steht leider "failed. no module loaded"

und "parse error, possibly incorrect indediation or mismatched brackets"

0
@Jensek81

Was soll map \a denn deiner Meinung nach bewirken? Das ist schlichtweg kein gültiger Haskell-Ausdruck. Habt ihr noch nicht gelernt wie Lambda-Ausdrücke in Haskell funktionieren? Das sind quasi anonyme Funktionen. Nach dem \ stehen die Parameter, dann kommt -> und dann der Funktionskörper. Der Lambda-Ausdruck (\x -> 2 * x) berechnet beispielsweise das Zweifache seines Arguments x.

(\x -> 2 * x) 2 ergibt 4.

0
@HansImGlueck178

map (\x -> if x == 'a' then 'b' else x) ist das, was im Editior geschrieben wird. Und dann will man ja die Funktion aufrufen. Da es in Haskell ja keinen Input-Befehl gibt wie in Python, muss man ja die Funktion aufrufen und dann den gewünschten Input eingeben. Ich hatte gehofft, wenn ich map (\x -> if x == 'a' then 'b' else x) in den Editor schreibe, dann die Shell (wir benutzen in der Vorlesung den GHCI) öffne, und map \a eingebe, dass dann als Output "b" in der Konsole angezeigt wird.

EDIT: Sorry, hab jetzt erst gesehen, dass du dein Post noch bearbeitet hast. Ja, Lambda-Ausdrücke hatten wir in der letzten Vorlesung gehabt.

0
@Jensek81

So funktioniert das nicht. Du musst eine neue Funktion definieren:

ersetzeA = map (\x -> if x == 'a' then 'b' else x)

Wenn du dann das Modul lädst kannst du in der interaktiven Shell die Funktion ersetzeA verwenden. Allerdings muss das Argument dann ein String sein. \a ist kein String in Haskell, "a" ( oder ['a']) ist einer.

1

Beim Haskellsyntax kann ich nicht helfen, da ich kein Haskell spreche.

Laut Aufgabentext sind Strings Charlisten, das ist schonmal gut (praktisch), denn üblicherweise wendet filter eine bool'sche Funktion auf jedes Element der Liste an. Bei True wird das Element übernommen. Hiermit sollte das eleminieren der unerwünschten Zeichen also machbar sein (Gut, der Name Filter sagt es eigentlich auch schon).

Ich gehe davon aus, daß die Funktion auch eine Lambdaform sein darf.

map wiederum wendet eien Funktion auf jedes einzelne Element der Liste an, hiermit könntest Du dann die Zeichenersetzungen erledigen:

map ( \x -> if x== ' ' then x='_') charlist

Wobei Charlist eben der 'String' ist. Ich habe das nicht getestet, kein Hugs usw., sondern mich dabei an Beispielen und Doku orientiert. Es soll nur die 'Richtung' zeigen.

Nachtrag: Für die korrekte Syntax siehe andere Antwort.

Was möchtest Du wissen?