4. Listen
4.1 Listen bauen
Listen sind ja ein Datentyp, der beliebig viele Elemente enthalten kann. Wenn wir also Code schreiben, dann wissen wir zum Zeitpunkt nicht, wie lang die Listen, mit denen wir arbeiten, sein werden. Wir müssen also mit endlichem Code beliebig große Listen verarbeiten können. Das geht letztendlich nur mit Rekursion. Ich stelle Ihnen jetzt ein paar Beispielfunktionen vor. Danach machen Sie bitte ein paar Übungen.
Beispiel
Ich will eine Funktion range a b schreiben, die
mir die Liste aller natürlichen Zahlen von \(a\) bis \(b\) liefert:
range : Int -> Int -> List Intrange a b =if a > b then[]elsea :: range (a + 1) b
Zur Erklärung: die Funktion gibt die Liste aller
natürlichen Zahlen \(x\) mit \(a \leq x \leq b\) aus.
Wenn \(a \gt b\), dann ist diese Liste leer: es gibt
keine solchen Zahlen \(x\). Dies ist der Basisfall der Rekursion
in Zeile 6-7. Wenn \(a \leq b\) ist, dann ist natürlich
\(a\) selbst die kleinste Zahl der Liste. Der Rest der
Liste, das sind dann die Zahlen von \(a+1\) bis \(b\).
Wir stellen also mit dem rekursiven Aufruf
range (a+1) b die Liste
\([a+1, a+2, \dots, b]\) her und fügen dann zum Schluss das
\(a\) am Anfang ein. All dies geschieht in Zeile 10. Jetzt
können wir es ausprobieren:
range 8 13[8,9,10,11,12,13] : List Intrange 4 2[] : List Int
Übungsaufgabe Modifizieren Sie die obige Funktion, so dass im Fall \(a \gt b\) die Liste in absteigender Form ausgegeben wird:
range 8 6[8, 7, 6] : List Int
Übungsaufgabe
Schreiben Sie eine Funktion
repeat howOften what, die eine Liste
erzeugt, die aus howOften Elementen besteht,
die allesamt gleich what ist:
repeat 4 "ja"["ja","ja","ja","ja"] : List String
Übungsaufgabe Schreiben Sie eine Funktion
datesFromTo dayFrom dayTo
die die Liste aller Daten von dayFrom bis
einschließlich dayTo erzeugt.
Verwenden Sie hier Date.tomorrow als
Subroutine!
Übungsaufgabe
Schreiben Sie eine Funktion
isPrime : Int -> Bool, die berechnet,
ob das Argument eine Primzahl ist. Schreiben Sie dann
eine Funktion
primesFromTo a b, die die Liste aller
Primzahlen von \(a\) bis \(b\) berechnet.