Praktische Informatik 3: Einführung in die Funktionale Programmierung
Vorlesung vom 27.10.2010: Einführung
Christoph Lüth & Dennis Walter
Universität Bremen Wintersemester 2010/11
Rev. 1074 1 [20]
Personal
I Vorlesung: Christoph Lüth<cxl@informatik.uni-bremen.de>
Cartesium 2.046, Tel. 64223
I Tutoren:
Diedrich Wolter<dwolter@informatik.uni-bremen.de>
Bernd Gersdorf<Bernd.Gersdorf@dfki.de>
Rene Wagner<Rene.Wagner@dfki.de>
Christian Maeder<Christian.Maeder@dfki.de>
Simon Ulbricht<tekknix@informatik.uni-bremen.de>
I Fragestunde: Berthold Hoffmann
<hof@informatik.uni-bremen.de>
I Website:www.informatik.uni-bremen.de/˜cxl/lehre/pi3.ws10.
2 [20]
Termine
IVorlesung: Mi 12 – 14, NW1 H 1 – H0020
ITutorien: Mo 10-12 MZH 5210 Christian Maeder Mo 16-18 MZH 1380 Rene Wagner Di 8-10 MZH 1100 Diedrich Wolter Di 10-12 MZH 1380 Diedrich Wolter Di 10-12 MZH 1400 Bernd Gersdorf Di 12-14 MZH 1450 Simon Ulbricht
IFragestunde: Do 9 – 11 Berthold Hoffmann (Cartesium 2.048)
IAnmeldungzu den Übungsgruppen über stud.ip
3 [20]
Übungsbetrieb
I Ausgabe der Übungsblätter über die WebseiteDonnerstag Mittag
I Besprechung der Übungsblätter in den Tutorien
I Bearbeitungszeit: eine Woche
I Abgabe: elektronisch bis Montag um 10:00
I ElfÜbungsblätter (voraussichtlich) plus 0. Übungsblatt
I Übungsgruppen: max.drei Teilnehmer(nur in Ausnahmefällen vier)
4 [20]
Scheinkriterien
IVonnÜbungsblättern werdenn−1 bewertet (geplantn=11)
IInsgesamtmind. 50%aller Punkte
IFachgespräch(Individualität der Leistung) am Ende
5 [20]
Spielregeln
I Quellen angebenbei
IGruppenübergreifenderZusammenarbeit;
IInternetrecherche, Literatur, etc.
I ErsterTäuschungsversuch:NullPunkte
I ZweiterTäuschungsversuch:Kein Schein.
I Deadline verpaßt?
ITriftigerGrund (z.B. Krankheit mehrerer Gruppenmitglieder)
IVorherankündigen, sonstnullPunkte.
6 [20]
Fahrplan
ITeil I: Funktionale Programmierung im Kleinen
IEinführung
IFunktionen und Datentypen
IRekursive Datentypen
ITypvariablen und Polymorphie
IFunktionen höherer Ordnung
ITypinferenz
ITeil II: Funktionale Programmierung im Großen ITeil III: Funktionale Programmierung im richtigen Leben
7 [20]
Warum funktionale Programmierung lernen?
I Denken inAlgorithmen, nicht inProgrammiersprachen I Abstraktion:Konzentration auf das Wesentliche I WesentlicheElemente moderner Programmierung:
IDatenabstraktionundFunktionale Abstraktion
IModularisierung
ITypisierungundSpezifikation
I Blick über den Tellerrand — Blick in die Zukunft I Studium6=Programmierkurs — was kommt in 10 Jahren?
8 [20]
Warum Haskell?
IModerneSprache
IStandardisiert, mehrereImplementationen
IInterpreter:hugs
ICompiler:ghc,nhc98
IReinfunktional
9 [20]
Geschichtliches
I Grundlagen1920/30
IKombinatorlogik undλ-Kalkül (Schönfinkel, Curry, Church) I ErsteProgrammiersprachen1960
ILISP(McCarthy),ISWIM(Landin) I WeitereProgrammiersprachen 1970– 80
IFP(Backus);ML(Milner, Gordon);Hope(Burstall);Miranda(Turner) I Konsolidierung1990
ICAML,Formale Semantikfür Standard ML
IHaskellalsStandardsprache I Hype2010
IScala,F#, Clojure
10 [20]
Referenzielle Transparenz
IProgramme als Funktionen
P:Eingabe→Ausgabe
IKeine veränderlichenVariablen— kein versteckterZustand
IRückgabewert hängt ausschließlich von Werten der Argumente ab, nicht vom Aufrufkontext (referentielle Transparenz)
IAlleAbhängigkeiten explizit
11 [20]
Definition von Funktionen
I Zwei wesentlicheKonstrukte:
IFallunterscheidung
IRekursion Satz
Fallunterscheidung und Rekursion auf natürlichen Zahlen sind turing-mächtig.
I Beispiel:
fac(n) =
(1 wennn=0 n·fac(n−1) sonst I Funktion kannpartiellsein.
12 [20]
Auswertung als Ausführungsbegriff
IProgrammewerden durchGleichungendefiniert:
f(x) =E
IAuswertungdurchAnwendender Gleichungen:
ISuchen nachVorkommenvonf, e.g.f(t)
If(t)wird durchE t
x
ersetzt
IAuswertung kanndivergieren!
IOperational(Ausführungsbegriff) vs.denotational(math. Modell) INichtreduzierbare Ausdrücke sindWerte
IVorgebeneneBasiswerte:Zahlen,Zeichen
IDefinierteDatentypen:Wahrheitswerte,Listen, . . .
13 [20]
Programmieren mit Funktionen
I Programmewerden durchGleichungendefiniert:
f a c n = i f n == 0 then 1
e l s e n∗ f a c ( n−1)
I Auswertung durchReduktionvonAusdrücken:
fac(2) if 2 == 0 then 1 else 2* fac(2-1) 2* fac(2- 1)
2* fac(1)
2* (if 1== 0 then 1 else 1* fac(1- 1)) 2* 1* fac(1- 1)
2* 1* fac(0)
2* 1* (if 0== 0 then 1 else 0* fac(0- 1))
2* 1* 1 2
14 [20]
Nichtnumerische Werte
IRechnen mitZeichenketten
r e p e a t n s == i f n== 0 then " "
e l s e s ++ r e p e a t ( n−1) s IAuswertung:
repeat 2 "hallo "
if 2 == 0 then "" else "hallo " ++ repeat (2-1) "hallo "
"hallo "++ repeat (2-1) "hallo "
"hallo "++ if 2-1 == 0 then ""
else "hallo "++ repeat ((2-1)-1) "hallo "
"hallo "++ ("hallo "++ repeat ((2-1)-1) "hallo ")
"hallo "++ ("hallo "++ if ((2-1)-1) == 0 then ""
else repeat (((2-1)-1)-1) "hallo ")
"hallo "++ ("hallo " ++ "")
"hallo hallo "
15 [20]
Typisierung
I Typenunterscheiden Arten von Ausdrücken:
repeat n s =. . . n Zahl s Zeichenkette I VerschiedeneTypen:
IBasistypen(Zahlen, Zeichen)
Istrukturierte Typen(Listen, Tupel, etc) I WozuTypen?
ITypüberprüfungwährendÜbersetzungerspartLaufzeitfehler
IProgrammsicherheit
16 [20]
Signaturen
IJede Funktion hat eineSignatur f a c :: I n t→ I n t
r e p e a t :: I n t→ S t r i n g→ S t r i n g
ITypüberprüfung
Ifacnur aufIntanwendbar, Resultat istInt
Irepeatnur aufIntundStringanwendbar, Resultat istString
17 [20]
Übersicht: Typen in Haskell
Typ Bezeichner Beispiel
Ganze Zahlen Int 0 94 -45
Fließkomma Double 3.0 3.141592
Zeichen Char ’a’ ’x’ ’\034’ ’\n’
Zeichenketten String "yuck" "hi\nho\"\n"
Wahrheitswerte Bool True False
Funktionen a-> b I Spätermehr.Vielmehr.
18 [20]
Imperativ vs. Funktional
IImperativeProgrammierung:
IZustandsübergangΣ→Σ, Lesen/Schreiben von Variablen
IKontrollstrukturen: Fallunterscheidung if. . .then. . .else Iteration while. . .
IFunktionaleProgrammierung:
IFunktionenf:E→A
IKontrollstrukturen: Fallunterscheidung Rekursion
19 [20]
Zusammenfassung
I ProgrammesindFunktionen, definiert durchGleichungen
IReferentielle Transparenz
Ikeinimpliziter Zustand, keineveränderlichen Variablen
I AusführungdurchReduktionvon Ausdrücken I Typisierung:
IBasistypen: Zahlen, Zeichen(ketten), Wahrheitswerte
IStrukturierte Typen: Listen, Tupel
IJede Funktionfhat eine Signaturf :: a-> b
20 [20]