ProInformatik: Funktionale Programmierung

Werbung
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
Herunterladen