Programmieren in Haskell

Einstieg in Haskell

In der Übung verwende ich den Glasgow Haskell Compiler. Wie ihr euch selbst Haskell-fähig macht, ist euch selbst überlassen. Eventuell hilfreiche Informationen dazu könnt ihr hier finden. Wer nach Literatur zur Progrmmiersprache Haskell sucht, dem sei auf die folgenden Bücher hingewiesen:
  • Learn You a Haskell For Great Good!
  • Real World Haskell

Haskell-Dateien können in einem beliebigen Editor geschrieben werden. Zum Ausführen benötigt man z.B. den Glasgow Haskell Compiler [Download hier]. Dessen interaktive Oberfläche startet man in einem Terminal mit ghci. Anschließend kann man ähnlich wie in Matlab bereits Befehle mit den Standardfunktionen aus der Prelude-Bibliothek aufrufen (z.B. liefert die Eingabe 2+3 die Ausgabe 5).

Wir schreiben unsere Funktionen meist in Module, die bereits beim Start von ghci geladen werden können mit ghci modulname. Später ist das Laden von Modulen mit :load modulname möglich. Bereits geladenen Module können mit :r neu geladen werden. Für weitere Informationen kann man mit dem Befehl :? die Hilfefunktion starten.

Ist das gewünscht Modul geladen, so können wir unsere Funktionen einfach mit den entsprechenden Argumenten ausführen, beispielsweise liefert die Eingabe fac 3 das Ergebnis 6 (vgl. Aufgabe 1, 01_01_solution.hs).

Listen

Listen sind in Haskell homogene Datentypen, d.h. alle Elemente einer Liste sind vom gleichen Datentyp.

Wichtige Operatoren:

  • Der cons-Operator : trennt den head vom tail einer Liste, z.B.
    
    [x1 , x2 , x3 , x4 , x5] = x1 : [x2 , x3 , x4 , x5]
    = x1 : x2 : [x3 , x4 , x5]
    = x1 : (x2 : [x3 , x4 , x5])
    
    Beim Pattern Matching ist zu beachten, dass [x] auf das Pattern (x:xs) matched (da x:[]), aber [] matched nicht auf dieses Pattern, da kein abspaltbares Element x in [] existiert.
  • Der Verkettungsoperator ++ verknüpft zwei Listen gleichen Typs miteinander, z.B.
    [x1 , x2 , x3] ++ [x4 , x5] = [x1 , x2 , x3 , x4 , x5]
    Dabei müssen alle Operatoren vom Typ Liste sein, d.h. um ein einzelnes Element anzuhängen, muss es in eine Liste geschrieben werden. Man beachte dabei den Unterschied zum cons-Operator.
    
    [x1] ++ [x2 , x3 , x4] = [x1 , x2 , x3 , x4]
    = x1 : [x2 , x3 , x4]
    

Insbesondere sind beide Operatoren rechtsassoziativ, d.h. a : b : c = a : (b : c) und a ++ b ++ c = a ++ (b ++ c).

Um exakte Laufzeiten zu erhalten, kann man vor dem Ausführen der Funktion mit dem Befehl :set +s die Laufzeitmessung in ghci aktivieren.

Zeichen und Zeichenketten

Wir müssen zwischen Zeichen (Characters) und Zeichenketten (Strings) unterscheiden.

  • Zeichen sind vom Typ Char und können mit einfachen Anführungszeichen ' eingegeben werden, z.B. 'e', '2'
  • Zeichenketten sind dagegen vom Typ String und werden mit doppelten Anführungszeichen " eingegeben, z.B. "hallo", "345"
Die Arbeit mit Zeichen und Zeichenketten unterscheidet sich nicht deutlich von der Arbeit mit Listen, denn Zeichenketten sind letztendlich nur Listen von Zeichen, d.h. String = [Char]