Einige Informationen zur Funktionalen Programmierung mit Haskell 17. Oktober 2007 Mit dieser kurzen Zusammenstellung wollen wir Euch den Einstieg in die Funktionale Programmierung etwas erleichtern. Vorlesung Die Vorlesung findet mit Beginn des Semesters 14-tägig jeweils am Freitag von 14:15 bis 15:45 Uhr im Gebäude OH14, Hörsaal 23 statt. Der erste Vorlesungstermin ist der 19. Oktober. Alle Informationen zur Vorlesung sind auch auf der Seite http://funlog.padawitz.de/fpba.html verfügbar. Die Übungszettel und eine kurze Übersicht über die in der Vorlesung behandelten Inhalte findet Ihr unter http://www-ai.cs.uni-dortmund.de/LEHRE/VORLESUNGEN/FP/ Leistungsnachweis Für einen Leistungsnachweis zu dieser Vorlesung ist eine erfolgreiche Teilnahme an den Übungen erforderlich. Es wird im Semester 14 Übungsblätter geben, je Übungsblatt werden 100 Punkte vergeben. Die erfolgreiche Teilnahme bedeutet ein Erreichen von mindestens 60% aller Punkte der ersten 7 Blätter und 60% aller Punkte der übrigen 7 Übungszettel. Übungen Die Anmeldung zu den Übungen erfolgt zu Beginn des ersten Vorlesungstermins, die Einteilung in die Übungsgruppen wird nach der Vorlesung zeitnah auf der Homepage veröffentlicht. Die Übungszettel sind jeden Freitag ab 16 Uhr auf der Homepage zur Vorlesung verfügbar. Die Abgabe der Übungszettel ist bis zum darauf folgenden Freitag um 14 Uhr per E-Mail an den Übungsgruppenleiter möglich. Bitte achtet darauf, Eure Abgaben in Form einer einfachen Text-Datei (ASCII) als Anhang zu senden. Programmiersprache Haskell In der Veranstaltung wird die funktionale Programmiersprache Haskell behandelt. Die wichtigsten Interpreter bzw. Compiler/Interpreter sind Hugs98 bzw. GHC, die von der Webseite www.haskell.org (dort dann dem Link Implementations folgen) heruntergeladen 1 werden können. Beide stehen für die gängigen Rechnerwelten (Windows, Mac und Linux) zur Verfügung. Unter Windows gibt es für Hugs98 eine einfache Entwicklungsumgebung winhugs, die in der Download-Version bereits enthalten ist. Für den GHC existiert ein Eclipse-PlugIn bzw. kann eine Version für Visual Studio heruntergeladen werden. Weitere Informationen dazu findet man unter www.haskell.org/haskellwiki/IDEs . Ein Haskell-Programm besteht im einfachsten Fall aus ein oder mehreren Funktionsdefinitionen in Haskell-Syntax, die in einer Textdatei mit der Endung .hs gespeichert werden. Die Ausführung eines solchen Programms erfolgt dann (z.B.) dadurch, dass nach dem Start des Haskell-Interpreters diese Datei geladen wird und die definierte Funktion auf Argumente der passenden Form angewandt wird. Beispiel 1 Speichert man den folgenden ASCII-Text fak :: Integer -> Integer fak 0 = 1 fak n = n * (fak (n-1)) in einer Textdatei namens factorial.hs, so wird dadurch ein Haskell-Programm erzeugt, das bei Anwendung der Funktion fak auf eine ganze Zahl n ≥ 0 den Wert n! berechnet. Die Ausführung des Programms geschieht dabei in der folgenden Form: Bei Verwendung eines Interpreters hugs (winhugs) oder ghci wird mit der Eingabe :l factorial.hs die Datei factorial.hs geladen, danach wird mit dem Aufruf von z.B. fak 100 die Fakultät von 100 berechnet. In einfachen Fällen ist die im Beispiel beschriebene Vorgehensweise ausreichend. Sobald die Eingaben oder Ausgaben des Programms umfangreicher werden, empfiehlt es sich, jeweils Ein- und Ausgabedateien anzulegen, die vom Programm verwendet werden. Man kann sich dabei eine schöne Eigenschaft von Haskell zu Nutze machen: die read-Funktion, die einen String einliest, kann so angepasst werden, dass das Ergebnis des Einlesens vom passenden Typ ist. Beispiel 2 Die Definition der Konstanten (0-stelligen Funktion) x durch x = read "12345":: Integer hat als Ergebnis die Integer-Konstante x = 12345, während die Festlegung x = read "0.12345":: Float als Ergebnis die Dezimalzahl-Konstante x = 0.12345 hat. Das Einlesen eines Wertes aus einer Datei geschieht dabei unter Verwendung von readFile, das Schreiben in eine Datei mit dem Befehl writeFile. 2 Beispiel 3 Wir definieren eine Funktion test durch test datei = do x <- readFile datei print (read x :: Int) Existiert dann eine Datei mit Namen dat” mit Inhalt 4321, so führt der Aufruf ” test "dat" zur Ausgabe 4321. Der Aufruf von writeFile "dat"(show 2.8) bewirkt, dass der Wert 2.8 in die Datei dat” geschrieben wird. show wandelt dabei die ” Dezimalzahl 2.8 in einen String um. Falls im Rahmen der Übungen kompliziertere Lese- und Schreiboperationen anfallen, so werden hierzu entsprechende Informationen rechtzeitig zur Verfügung gestellt. Auf den Webseiten von Herrn Padawitz findet man unter http://funlog.padawitz.de/fpba.html eine sehr empfehlenswerte Vorgehensweise beschrieben, die die hier am Einzelfall dargestellten Lese- und Schreiboperationen so organisiert, dass man nicht mehr für jede neue Aufgabenstellung diese implementieren muss. 3