4. Listen

4.2 Listen verarbeiten

Im letzten Kapitel haben Sie gelernt, wie man Listen mit Hilfe von :: erstellt. Nun lernen Sie, wie man Listen verarbeitet. Als erstes Beispiel wollen wir eine Funktion, die die Länge einer Liste berechnet. Da es sich bei List a um einen Custom-Typ mit den beiden Konstruktoren [] und :: handelt (wobei :: allerdings mit Infix-Schreibweise verwendet wird), müssen Sie zum Verarbeiten der Liste alle Konstruktoren mit einem case-Ausdruck abfragen:

laenge : List a -> Int
laenge list =
    case list of
        [] ->
            0

        x :: restList ->
            1 + laenge restList

und dann

laenge ["a", "e", "i", "o", "u"]                        
5 : Int
                    

Übungsaufgabe Schreiben Sie eine Funktion incrementAll : List Int -> List Int, die jede Zahl in der Liste um 1 erhöht:

incrementAll [1,3,5,8]                            
[2,4,6,9] : List Int

Ich zeige Ihnen nun einen weiteren primitiven Datentyp: Char. Dieser repräsentiert ein einzelnes Zeichen:

'b'                        
'b' : Char

Verwechseln Sie bitte nicht 'b' und "b". Ersteres ist ein Char, letzteres ein String der Länge 1. Intern sinds Strings Arrays (so etwas wie Listen) von Chars. Sie können einen String leicht in eine Liste aus Chars umwandeln und umgekehrt:

String.toList "hallo"                        
['h','a','l','l','o'] : List Char
String.fromList ['g','u','t','e','n',' ','M','o','r','g','e','n']
"guten Morgen" : String

Übungsaufgabe Schreiben Sie eine Funktion kleinbuchstaben : String -> String, die einen String in lauter Kleinbuchstaben verwandelt. Gehen Sie wie folgt vor: wandeln Sie den String in eine List Char um. Schreiben Sie dann eine rekursive Funktion, die durch die Liste geht und alles in Kleinbuchstaben umwandelt mit Hilfe von Char.toLower. Dann machen Sie aus Ihrer List Char wieder einen String

Im Ernstfall können Sie natürlich String.toLower verwenden. Die obige Übung diente eher dazu, Ihre rekursiven Programmierfähigkeiten zu trainieren. Für die nächste Augabe hilft Ihnen String.toLower allerdings nicht:

Übungsaufgabe Schreiben Sie eine Funktion toAltCaps : String -> String, die einen String in AltCaps umwandelt:

toAltCaps "Guten Morgen, Herr Professor"
"GuTeN MoRgEn, HeRr pRoFeSsOr" : String

Übungsaufgabe Schreiben Sie eine Funktion append : List a -> List a -> List a, die eine Liste hinten an eine bestehende anhängt:

append [1,3,5] [2,4,6]
[1,3,5,2,4,6] : List number

Übungsaufgabe Schreiben Sie eine Funktion umdrehen : List a -> List a, die eine Liste umdreht.

Schreiben Sie eine Wrapper-Funktion erzeugenUndUmdrehen : Int -> Int, die folgendes macht: erzeugenUndUmdrehen n erzeugt erst die Liste [0,1,...,n-1]; dann dreht sie sie um; dann berechnet sie die Länge der Ergebnisliste (das ist wieder \(n\), schon klar). Der Witz ist, dass Sie nun die Laufzeit Ihrer Funktion erzeugenUndUmdrehen n mit Herrn Schellenbergers App schellenberger-measure-time.zip messen können, wie im Stundenplaneintrag vom 23. Oktober 2023 beschrieben.