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 Int
range a b =
    if a > b then
        []

    else
        a :: 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 Int
range 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.