Wie ersetzen map, filter und fold eine Schleife?
Mit map, filter und fold bearbeiten Sie Listen in Haskell, ohne eine Schleife zu schreiben. Jede der drei Funktionen erledigt eine feste Aufgabe, und Sie übergeben nur die kleine Funktion, die den Unterschied macht.
Ein Beispiel: Aus einer Liste von Preisen sollen die Preise über 5 Euro verdoppelt und addiert werden. Das sind drei Schritte, jeder ein Aufruf.
Am Ende dieser Lektion
Notiz
Ich kann eine Schleife über eine Liste durch map, filter oder fold ersetzen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Funktion höherer Ordnung | eine Funktion, die eine andere Funktion als Wert bekommt | |
| map | wendet eine Funktion auf jedes Element an | map (* 3) [1, 2] |
| filter | behält nur die Elemente, für die eine Prüfung gilt | filter even [1, 2] |
| fold | faltet eine Liste mit einer Funktion zu einem einzigen Wert | |
| Anfangswert | der Startwert einer Faltung, bei der leeren Liste das Ergebnis |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
map wendet eine Funktion auf jedes Element an
map nimmt eine Funktion und eine Liste und gibt eine neue Liste zurück. Jedes Element wird durch das Ergebnis der Funktion ersetzt. map (* 3) [1, 2, 3] ergibt [3, 6, 9].
Der Teil (* 3) ist eine Funktion, die ihr Argument mit 3 malnimmt. map ist eine Funktion höherer Ordnung, denn sie bekommt eine Funktion als Wert.
Jede Zahl mit 3 multiplizieren
docker exec haskell ghc -e "map (* 3) [1, 2, 3]"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Der Typ von map
docker exec haskell ghc -e ":type map"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
filter behält nur, was die Prüfung besteht
filter nimmt eine Prüffunktion, die True oder False liefert, und eine Liste. Es behält die Elemente, bei denen die Prüfung True ergibt.
filter even [1 .. 10] ergibt [2, 4, 6, 8, 10]. Die Schreibweise [1 .. 10] ist die Liste der Zahlen von 1 bis 10. Die Reihenfolge der Elemente bleibt gleich.
Nur die geraden Zahlen behalten
docker exec haskell ghc -e "filter even [1 .. 10]"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
fold faltet eine Liste zu einem Wert
Eine Faltung (fold) geht eine Liste durch und führt einen Wert mit, den Zwischenstand. Sie geben eine Funktion mit zwei Eingaben und einen Anfangswert an. Bei jedem Element verrechnet die Funktion Zwischenstand und Element.
foldl (+) 0 [1, 2, 3] startet bei 0 und addiert nacheinander 1, 2 und 3.
Beispiel: foldl (+) 0 [1, 2, 3]
| Schritt | Zwischenstand vorher | Element | Zwischenstand nachher |
|---|---|---|---|
| 1 | 0 | 1 | 1 |
| 2 | 1 | 2 | 3 |
| 3 | 3 | 3 | 6 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Liste von Zahlen addieren
docker exec haskell ghc -e "foldr (+) 0 [1, 2, 3, 4]"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
foldl und foldr gehen von verschiedenen Seiten
foldl beginnt links, foldr beginnt rechts. Bei Plus und Mal ist das egal, bei Minus nicht.
foldl (-) 10 [1, 2, 3] rechnet ((10 minus 1) minus 2) minus 3 und ergibt 4. foldr (-) 10 [1, 2, 3] rechnet 1 minus (2 minus (3 minus 10)) und ergibt minus 8.
foldl mit Minus
docker exec haskell ghc -e "foldl (-) 10 [1, 2, 3]"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
foldr mit Minus
docker exec haskell ghc -e "foldr (-) 10 [1, 2, 3]"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele glauben, map oder filter verändere die Liste. In Haskell ändert sich kein Wert. Beide geben eine neue Liste zurück, die alte bleibt, wie sie war. Wer das Ergebnis nicht benutzt, hat nichts erreicht.
Die alte Liste bleibt erhalten
docker exec haskell ghc -e "let zahlen = [1, 2, 3] in (map (* 2) zahlen, zahlen)"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Filter, map und Summe zusammen
docker exec haskell ghc -e "sum (map square (filter isEven [1 .. 6]))" Basics.hsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
map, filter und fold selbst bauen
Um die drei Funktionen zu verstehen, bauen Sie sie in Python nach, mit Schleifen und ohne die Hilfen der Sprache. Sie schreiben mein_map, mein_filter und meine_faltung.
Danach benutzen Sie die Faltung für die Summe. Eine Faltung ist die Verallgemeinerung der Schleife, die eine Summe bildet.