Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Haskell: map, filter und fold

Nach dieser Lektion: Ich kann eine Schleife über eine Liste durch map, filter oder fold ersetzen.

Lektion, 70 Min.8 BefehleHaskell-Lab: funktionale Programmierung mit Funktionen und Typen, im Browser

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

BegriffWas er bedeutetBeispiel
Funktion höherer Ordnungeine Funktion, die eine andere Funktion als Wert bekommt
mapwendet eine Funktion auf jedes Element anmap (* 3) [1, 2]
filterbehält nur die Elemente, für die eine Prüfung giltfilter even [1, 2]
foldfaltet eine Liste mit einer Funktion zu einem einzigen Wert
Anfangswertder 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

Befehl
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

Befehl
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

Befehl
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]

SchrittZwischenstand vorherElementZwischenstand nachher
1011
2123
3336

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Eine Liste von Zahlen addieren

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
docker exec haskell ghc -e "sum (map square (filter isEven [1 .. 6]))" Basics.hs

Hier 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.

Über dieses Lab und seinen Quellcode: Haskell-Lab: funktionale Programmierung mit Funktionen und Typen, im Browser

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.