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.
Beim Pattern Matching ist zu beachten, dass[x1 , x2 , x3 , x4 , x5] = x1 : [x2 , x3 , x4 , x5] = x1 : x2 : [x3 , x4 , x5] = x1 : (x2 : [x3 , x4 , x5])
[x]
auf das Pattern(x:xs)
matched (dax:[]
), aber[]
matched nicht auf dieses Pattern, da kein abspaltbares Elementx
in[]
existiert. - Der Verkettungsoperator
++
verknüpft zwei Listen gleichen Typs miteinander, z.B.
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 , x5] = [x1 , x2 , x3 , x4 , x5]
[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"
String = [Char]