Informatik Institut, Fachbereich Mathematik und Informatik ProInformatik: Funktionale Programmierung Woche 1: 28.7-1.8.2008 Dozentin: Maria Knobelsdorf Tutorin und Tutor: Peggy Sabri, Dirk Wiesenthal 28.7 – 22.8.2008 Raum 005, Takustr. 9 14195 Berlin Herzlich Willkommen! An der Freien Universität Berlin Am Fachbereich Mathematik und Informatik Am Institut für Informatik ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 2 Tag 1, 28.7.2008 • Kennen lernen • Vorstellen des Ablaufs • Formale Kriterien zum „erfolgreichen Abschließen“ der Veranstaltung • Einführung in „Funktionale Programmierung“ mit Haskell ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 3 Ehe es los geht... Wir wollen Sie kennenlernen! Wissen, mit welchen Erfahrungen, Erlebnissen, Vorwissen, und Erwartungen Sie Ihr Studium der Informatik beginnen. Schreiben Sie daher bitte... ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 4 Ablauf Veranstaltungsdauer: 28.7 – 22.8.2008 Montag-Freitag: • 9~12 Uhr: Vorlesung (im Raum 005) • 12-13:30 Uhr: Pause (Mensa, etc.) • 13:30-16:30 Uhr: Übung (im Raum 005 oder Rechnerräume) • 16:30-17:00 Uhr: Pause • 17-18 Uhr: Gemeinsames Vorrechnen (im Raum 005) ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 5 Formale Kriterien Es gibt am Ende eine Klausur, am 22.8.2008 (Uhrzeit wird noch bekannt gegeben) Die Veranstaltung wird als „erfolgreich abgeschlossen“ bewertet bei: 1. Regelmäßiger Teilnahme an Vorlesung, Übungen und dem Vorrechen 2. Zweimal Vorrechnen einer Aufgabe aus der Übung 3. In der Klausur mind. 50 % der Punkte erreichen ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 6 Formale Kriterien: Abschlussnote 1. Bei erfolgreichem Abschluss gibt es am Ende einen benoteten Schein. 2. Die Note setzt sich aus der Anzahl der in der Klausur erreichten Punkte zusammen: 90 75 60 50 – – – – 100% der Punkte: sehr gut, 1.0, 1.3 90% der Punkte: gut: 1.7, 2.0, 2.3 75% der Punkte: befriedigend:2.7, 3.0, 3.3 60% der Punkte: ausreichend: 3.7 – 4.0 Weniger als 50%: nicht bestanden Jede/r von Ihnen kann am Ende eine 1.0 erreichen, es hängt nur davon ab, wie viel Sie bereit sind zu arbeiten und sich zu engagieren! ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 7 Inhaltlicher Ablauf Wir arbeiten das Buch: „Haskell, The Craft of Functional Programming“ durch. Außerdem werden wir uns mit Lambda-Kalkül, Berechenbarkeit, µOperator, etc. beschäftigen Das Buch kann im Handel erworben werden, oder als Kopie... Link zur Veranstaltung: www.inf.fu-berlin.de/w/DDI/ProInformatikFunkProg Nützliche Links: http://www.haskell.org http://de.wikipedia.org ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 8 Inhaltlicher Ablauf Vormittags: • Kennenlernen von neuen Inhalten, Fähigkeiten, Wissen • Angabe von ILOs (intended learning outcomes, klausurrelevant!) • Fachvortrag, Gruppenarbeit, Kurzessays Nachmittags: • ausführliches Erarbeiten der am Vormittag vorgestellten neuen Inhalte • Bearbeiten von Aufgaben • Betreuung durch Tutorin Abschluss: • Gemeinsames Vorrechnen der bearbeiteten Aufgaben ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 9 Funktionale Programmierung: S. Thomson: Haskell, The Craft of Functional Programming Kapitel 1 Einführung in die Funktionale Programmierung ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 10 Tag 1, ILOs • • • • • • • • • Wissen: Aufbau/Struktur einer Funktion Signatur einer Funktion Typen und Variablen Datentypen: Int, Bool Numerische und Boolsche Operatoren Auswahl, Guard-Operator Anwenden: Funktionen für einfache numerische und logische Probleme schreiben • Funktionen mit Eingabewerten konkret auswerten • Funktionen in Hugs testen ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 11 1.1 Was ist Funktionale Programmierung? • Was ist überhaupt Programmierung? • Was ist ein Programm? • Wozu programmieren wir? • Was ist der Computer für ein Gerät? • Wieso muss man ihn programmieren? Einen Toaster muss man schließlich auch nicht programmieren... Überlegen Sie kurz und schreiben Sie Ihre Antwort stichpunktartig auf, gerne auch als Diskussion mit den Nachbarinnen oder Nachbarn (5 Minuten) ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 12 1.2 Funktionalität des Computers • Ein Toaster röstet Brotscheiben, ein Mixer mischt Zutaten, die Bohrmaschine bohrt Löcher in die Wand. Die Funktionalität dieser Geräte ist in der Hardware selbst enthalten. • Damit der Rechner „etwas tut“ benötigt er „jemanden“, der ihm sagt was er tun muss: das Computer-Programm. Der Computer wechselt mit jedem Programm seine Funktionalität und das macht ihn so universell universell. ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 13 Programmiersprachen: Kommunizieren mit dem Rechner • Programme müssen in einer dem Computer verständlichen Sprache geschrieben sein. • Wir sprechen Deutsch, Englisch... • Welche Sprache spricht der Computer? Informationen werden im Computer durch zwei physikalische Zustände dargestellt: • Strom fließt, Strom fließt nicht (symbolisch:1 und 0) •Die Sprache des Computers ist der Maschinencode: 00110100100001010001010101 01010001010101101010101000 10100010101011010101010001 Für Menschen nicht „sprechbar, schreibbar“ ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 14 1.3 Programmiersprachen Lösung: Programm wird in einer sog. Programmiersprache geschrieben und dann in Maschinencode übersetzt. maxsq x y | sqx > sqy = sqx | otherwise = sqy where sqx = sq x sqy = sq y sq::Int -> Int sq z = z*z 01001101001000010100010101 01010001010101101010101000 10100010101011010011010010 00010100010101010001110101 01010001010101101010101000 10100010101011010101010001 01010101000101101011100001 01001101001000010100010101 01010001010011010010000101 00101010111111100111101101 01010001010101101010101000 10100010101011010101010001 01010110101010100010101000 10100010010011010010000101 00101010110101010001010100 01010001010101101010101000 10100010101011010101010001 01001101001000010100010101 01010001010101101010101000 10100010101011010101010001 101011010101010001... •Kommuniziert wird schriftlich: Programm wird in einer Textdatei abgelegt und mit Hilfe eines anderen Programms übersetzt (Compiler) und ausgeführt (Interpreter). ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 15 Programmiersprachen lernen • Um dem Computer „sagen zu können“, was er tun soll, muss man eine Programmiersprache lernen! • Man muss wissen, wie man sein Programm in Maschinencode übersetzt und ausführt. Eine Programmiersprache lernen ist wie eine Fremdsprache lernen: • Man muss ein bisschen auswendig lernen (wie Vokabeln oder Grammatikregeln) • Und man muss das „Sprechen“ der Sprache (hier programmieren) üben, üben, üben ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 16 Funktionale Programmiersprachen • Es gibt verschiedene Familien von Programmiersprachen: objektorientiert, imperativ, funktional und strukturell • In dieser Veranstaltung geht es um die Funktionale Programmiersprache Haskell (nach Haskell B. Curry, der das LambdaKalkül mit entwickelt hat) • Das Programm besteht aus einer Funktion, die eine Eingabe erhält, diese verarbeitet und eine Ausgabe liefert. Beispiele: • Addition dreier Zahlen x, y, z • Abstand zwischen zwei Städten a, b Eingabe Funktion (Black box) ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf Ausgabe 17 Ausdrücke berechnen • In der Schule lernen wir Ausdrücke zu berechnen: ((7 - 3) * 2) + 6 = (4 * 2) + 6 =8+6 = 14 • Funktionale Programmierung basiert auf der Idee Ausdrücke zu berechnen. • Ein Programm in Haskell besteht aus der Definition einer Funktion, die eine Arbeitsanweisung für den Computer ist, wie er die Eingabe berechnen soll. • Diese Arbeitsanweisung ist im Prinzip die Berechnung eines Ausdrucks. ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 18 1.4 Programm in Haskell Beispielprogramm in Haskell für die Addition von drei Zahlen. Funktionsname addDrei x y z = x + y + z EingabeVariablen ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf Ausdruck mit Rechenvorschrift, gleichzeitig die Ausgabe 19 Ein Haskell-Programm ausführen • Wenn man das fertige Program in eine Textdatei geschrieben hat, möchte man, dass der Computer das Programm ausführt. • Um ein Haskell-Programm auszuführen benötigt man einen Compiler oder Interpreter. •Der Compiler übersetzt das Programm in Maschinensprache. •Der Interpreter übersetzt das Programm und führt es gleich aus. • Hugs ist ein Haskell-Interpreter und frei verfügbar: •http://www.haskell.org ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 20 1.5 Variablen in Haskell • Variablen sind in Haskell „Platzhalter“ für konkrete Werte addDrei x y z = x + y + z • x, y und z sind Variablen (auch Parameter genannt) addDrei 3 5 2 10 • Die Zahlen 3, 5 und 2 sind Variablenwerte (auch Parameterwerte) ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 21 1.6 Daten und Datentypen • Haskell ist eine streng typisierte Programmiersprache • Alle Werte (Eingabe oder Ausgabe) und ihre dazugehörigen Variablen sind klassifiziert nach Datentypen addDrei x y z = x + y + z • x, y und z sind Variablen vom Typ Int • Int ist der Datentyp für ganze Zahlen im Bereich: -2147483648 bis + 2147483647 (=32 bit Darstellung) • Daten vom Typ Int können mit allen numerischen Operatoren verknüpft werden: + - * / ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 22 1.7 Signatur einer Funktion • Jede Funktion hat eine Signatur, diese beschreibt die Datentypen von Eingabe und Ausgabe Datentyp von x Datentyp von y Datentyp von z Datentyp von (x+y+z) addDrei::Int -> Int -> Int -> Int addDrei x y ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf z =x+y+z 23 Übungsaufgabe Schreiben Sie die Funktion (und ihre Signatur) square, die eine Eingabe vom Typ Int hat und als Ausgabe das Quadrat der Eingabe liefert. ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 24 1.8 Der Datentyp Bool und Logische Ausdrücke •Bool ist der Datentyp für die logischen Werte: True und False 2>3 False Int-Werte können verknüpft werden mit: >, <, >=, <=, ==, /= • Die logischen Werte True und False können auch miteinander verknüpft werden mit sog. Boolschen Operatoren: • logisches UND, && • logisches ODER, || • logisches NICHT, not && True False || True False not True True False True True True True False False False False False True False False True ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 25 Logische Ausdrücke Überlegen Sie welche Signatur die folgenden Funktionen haben und was sie berechnen: func1 x = (x>-1) && (x<+1) func2 x y = x> y func3 x y = not(x&&y) func4 x y = not(x||y) Auswertung von: >func1 4 >func4 True False ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 26 1.9 Der Guard-Operator • Um eine Auswahl im Programm herbeizuführen gibt es den GuardOperator: maxi :: Int -> Int -> Int maxi x y | x>=y = x |otherwise = y • Der senkrechte Strich heißt Guard • Jede Funktion kann beliebig viele Guards haben • Der letzte sollte immer otherwise sein • Guards müssen eingerückt werden Was kommt raus bei: > maxi 3 4 > ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 27 • Schreiben Sie den Auswertungsweg für den Programmaufruf: > maxi (square 3) (square 3) >? ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 28 Funktionen rufen Funktionen auf • In einer Funktionsdefinition kann man auch andere Funktionen aufrufen: add x y = x + y add3 x y z = add (add x y) z • Die aufgerufene Funktion muss bekannt sein, d.h. in der Datei weiter oben stehen. Auswertung von >add3 2 7 1 ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 29 Tag 1, ILOs • • • • • • • • • Wissen: Aufbau/Struktur einer Funktion Signatur einer Funktion Typen und Variablen Datentypen: Int, Bool Numerische und Boolsche Operatoren Auswahl, Guard-Operator Anwenden: Funktionen für einfache numerische und logische Probleme schreiben • Funktionen mit Eingabewerten konkret auswerten • Funktionen in Hugs testen ProInformatik, Funktionale Programmierung, 28.7-22.8.2008, M. Knobelsdorf 30