Praktische Informatik 3: Funktionale Programmierung Vorlesung 1 vom 02.11.2020: Einführung
Christoph Lüth
Wintersemester 2020/21
11:51:08 2021-02-22 1 [35]
Was ist Funktionale Programmierung?
IProgramme als Funktionen — Funktionen als Programme IKeineveränderlichen Variablen
IRekursionstatt while-Schleifen
IFunktionen als Daten — Daten als Funktionen IErlaubtAbstraktionsbildung
IDenken in Algorithmen, nicht in Zustandsveränderung
PI3 WS 20/21 2 [35]
Lernziele
IKonzepteundtypische Merkmaledes funktionalen Programmierens kennen, verstehen und anwenden können:
IModellierung mitalgebraischen Datentypen IRekursion
IStarkeTypisierung
IFunktionen höher Ordnung(map, filter, fold)
IDatenstrukturen und Algorithmen in einer funktionalen Programmierspracheumsetzen und auf einfachere praktische Problemeanwendenkönnen.
Modulhandbuch Informatik (Bachelor)
Die VorlesungPraktische Informatik 3vermittelt essenzielles Grundwissen und
Basisfähigkeiten, deren Beherrschung für nahezu jede vertiefte Beschäftigung mit Informatik Voraussetzung ist.
PI3 WS 20/21 3 [35]
I. Organisatorisches
PI3 WS 20/21 4 [35]
Personal
IVorlesung:
Christoph Lüth<clueth@uni-bremen.de>
www.informatik.uni-bremen.de/~clueth/(MZH 4186, Tel. 59830) ITutoren:
Thomas Barkoswky <barkowsky@informatik.uni-bremen.de>
Tobias Brandt <Tobias.Brandt@dfki.de>
Alexander Krug <krug@uni-bremen.de>
Robert Sachtleben <rob_sac@uni-bremen.de>
Muhammad Tarek Soliman <soliman@uni-bremen.de>
IWebseite:www.informatik.uni-bremen.de/~cxl/lehre/pi3.ws20
PI3 WS 20/21 5 [35]
Corona-Edition
IVorlesungen sindasynchron
IVideos werden Montags zur Verfügung gestellt IVorlesungen in mehreren Teilen mit Kurzübungen
IÜbungen: Präsenz/Online IPräsenzbetrieb für 56 Stud./Woche I3 Tutorien mit Präsenzbetrieb
IPräsenztutorium istoptional!
IPräsenztermine gekoppelt an TI2 (gleiche Kohorte) I3 Online-Tutorien
PI3 WS 20/21 6 [35]
Termine
IVorlesung: Online
ITutorien: Di 12– 14 MZH 1470 Robert Online Tobias Do 10– 12 MZH 1470 Thomas Online Robert
10– 12 MZH 1090 Tarek Online Alexander IAlle Tutorien haben einen Zoom-Raum (für Präsenztutorien als Backup) — siehe Webseite IDiese WochealleTutorien online — Präsenzbetrieb startetnächste Woche
IAnmeldungzu den Übungsgruppen über stud.ip (ab 18:00) ISprechstunde: Donnerstags 14-16 (via Zoom, bei Bedarf)
Scheinkriterien
IÜbungsblätter:
I6 Einzelübungsblätter (fünf beste werden gewertet) I3 Gruppenübungsblätter (doppelt gewichtet)
IÜbungsblätter der letzten Semester könnennichtberücksichtigt werden IElektronische Klausur am Ende (Individualität der Leistung)
IMind. 50% in den Einzelübungsblättern, in allen Übungsblättern und mind. 50% in der E-Klausur
INote: 25% Übungsblätter und 75% E-Klausur INotenspiegel(in Prozent aller Punkte):
Pkt.% Note Pkt.% Note Pkt.% Note Pkt.% Note 89.5-85 1.7 74.5-70 2.7 59.5-55 3.7
≥95 1.0 84.5-80 2.0 69.5-65 3.0 54.5-50 4.0 94.5-90 1.3 79.5-75 2.3 64.5-60 3.3 49.5-0 n/b
Spielregeln
IQuellen angebenbei
IGruppenübergreifenderZusammenarbeit IInternetrecherche, Literatur, etc.
ITäuschungsversuch:
INullPunkte,keinSchein,Meldungan dasPrüfungsamt IDeadline verpaßt?
ITriftigerGrund (z.B. Krankheit) IVorherankündigen, sonstnullPunkte.
PI3 WS 20/21 9 [35]
Statistik von PI3 im Wintersemester 19/20
PI3 WS 20/21 10 [35]
Übungsbetrieb
IAusgabe der Übungsblätter über die WebseiteMontag mittag IBesprechung der Übungsblätter in den Tutorien
I6 Einzelübungsblätter:
IBearbeitungszeit bisMontag folgender Woche 12:00 IDie fünf besten werden gewertet
I3 Gruppenübungsblätter (doppelt gewichtet):
IBearbeitungszeit bisMontag übernächster Woche 12:00 IÜbungsgruppen: max.drei Teilnehmer
IAbgabeelektronisch
IBewertung: Korrektheit, Angemessenheit (“Stil”), Dokumentation
PI3 WS 20/21 11 [35]
Ablauf des Übungsbetriebs
Ausgabepi3-ws20-uebXX-vorlage.zip
Student
uebXX
pi3-ws20-ueb-<name>/uebXX
Tutor
pi3-ws20-ueb-<name>/uebXX
download
clone/pull
pi3-ws20-ueb-<name>/uebXX
push pi3-ws20-ueb-<name>/uebXX
Bearbeitung
Korrektur
PI3 WS 20/21 12 [35]
II. Einführung
PI3 WS 20/21 13 [35]
Fahrplan
ITeil I: Funktionale Programmierung im Kleinen IEinführung
IFunktionen
IAlgebraische Datentypen ITypvariablen und Polymorphie IFunktionen höherer Ordnung I IRekursive und zyklische Datenstrukturen IFunktionen höherer Ordnung II
ITeil II: Funktionale Programmierung im Großen ITeil III: Funktionale Programmierung im richtigen Leben
PI3 WS 20/21 14 [35]
Warum funktionale Programmierung lernen?
IFunktionale Programmierung macht aus Programmierern Informatiker IBlick über den Tellerrand — was kommt in 10 Jahren?
IHerausforderungender Zukunft:
INebenläufigeundreaktiveSysteme (Mehrkernarchitekturen, serverless computing) IMassivverteilteSysteme („Internet der Dinge“)
IGroßeDatenmengen(„Big Data“)
PI3 WS 20/21 15 [35]
The Future is Bright — The Future is Functional
IFunktionale Programmierung enthält diewesentlichenElemente moderner Programmierung:
IDatenabstraktionundFunktionale Abstraktion IModularisierung
ITypisierungundSpezifikation
IFunktionale Ideen jetzt im Mainstream:
IReflektion— LISP IGenericsin Java — Polymorphie
ILambda-Fkt.in Java, C++ — Funktionen höherer Ordnung
PI3 WS 20/21 16 [35]
Geschichtliches: Die Anfänge
IGrundlagen1920/30
IKombinatorlogik undλ-Kalkül (Schönfinkel, Curry, Church) IErste funktionaleProgrammiersprachen1960
ILISP(McCarthy),ISWIM(Landin) IWeitereProgrammiersprachen 1970– 80
IFP(Backus);ML(Milner, Gordon);Hope(Burstall);Miranda(Turner)
Moses Schönfinkel Haskell B. Curry Alonzo Church John McCarthy John Backus Robin Milner Mike Gordon
PI3 WS 20/21 17 [35]
Geschichtliches: Die Gegenwart
IKonsolidierung1990
ICAML,Formale Semantikfür Standard ML IHaskellalsStandardsprache
IKommerzialisierung2010 IOCaml
IScala,Clojure(JVM) IF#(.NET)
PI3 WS 20/21 18 [35]
Warum Haskell?
IModerneSprache
IStandardisiert, mehrereImplementationen IInterpreter:ghci,hugs
ICompiler:ghc,nhc98 IBuild:stack
IReinfunktional
IEssenzder funktionalen Programmierung
PI3 WS 20/21 19 [35]
Programme als Funktionen
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
PI3 WS 20/21 20 [35]
Beispiel: Programmieren mit Funktionen
IProgrammewerden durchGleichungendefiniert:
fac n=if n==0then 1else n∗fac(n-1) IAuswertung durchReduktionvonAusdrücken:
fac 2→if2==0then1 else2∗ fac (2-1)
→ifFalsethen1 else2∗fac 1
→2∗fac 1
→2∗if 1==0then 1else 1∗fac (1-1)
→2∗if Falsethen 1else 1∗fac (1-1)
→2∗1∗ fac 0
→2∗1∗ if0==0 then1else 0∗fac (0-1)
→2∗1∗ ifTruethen 1else 0∗fac (0-1)
→2∗1∗ 1→2
PI3 WS 20/21 21 [35]
Beispiel: Nichtnumerische Werte
IRechnen mitZeichenketten
repeat n s=if n==0then ""else s++repeat (n-1) s IAuswertung:
repeat 2 "hallo␣"
→if2==0then""else"hallo␣"++repeat (2-1) "hallo␣"
→ifFalsethen""else"hallo␣"++repeat 1 "hallo␣"
→"hallo␣"++repeat 1 "hallo␣"
→"hallo␣"++if1==0then""else"hallo␣"++repeat (1-1) "hallo␣"
→"hallo␣"++ifFalsethen""else"hallo␣"++repeat 1 "hallo␣"
→"hallo␣"++("hallo␣"++repeat 0 "hallo␣")
→"hallo␣"++("hallo␣"++if0==0then""else"hallo␣"++repeat (0-1) "hallo␣")
→"hallo␣"++("hallo␣"++ifTruethen""else"hallo␣"++repeat (-1) "hallo␣")
→"hallo␣"++("hallo␣"++"")
→"hallo␣hallo␣"
PI3 WS 20/21 22 [35]
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!
Ausdrücke und Werte
INichtreduzierbare Ausdrücke sindWerte
IVorgebeneneBasiswerte:Zahlen,Zeichen IDurchImplementationgegeben
IDefinierteDatentypen:Wahrheitswerte,Listen, . . .
IModellierungvon Daten
Jetzt seit ihr dran!
Übung 1.1: Auswertung
Hier ist eine weitere Beispiel-Funktion:
stars n=ifn>1thenstars (div n 2)++"∗" else""
div n mist die ganzzahlige Division:div 7 2→3 Berechnet wie oben die Reduktion vonstars 5 Lösung:
stars 5 →if5>1thenstars (div 5 2)++"∗"else""
→stars 2++"∗"
→(if2>1thenstars (div 2 2)++"∗"else"")++"∗"
→(stars 1++"∗") ++"∗"
→((if1>1then stars (div 1 2)++ "∗"else"") ++"∗")++"∗"
→(""++ "∗")++"∗"→"∗∗"
PI3 WS 20/21 25 [35]
III. Typen
PI3 WS 20/21 26 [35]
Typisierung
ITypenunterscheiden Arten von Ausdrücken und Werten:
repeat n s =. . . n Zahl s Zeichenkette IWozuTypen?
IFrühzeitiges Aufdecken “offensichtlicher” Fehler IErhöhteProgrammsicherheit
IHilfestellung beiÄnderungen Slogan
“Well-typed programs can’t go wrong.”
—Robin Milner
PI3 WS 20/21 27 [35]
Signaturen
IJede Funktion hat eineSignatur
fac :: Int→ Int
repeat :: Int→ String→String ITypüberprüfung
Ifacnur aufIntanwendbar, Resultat istInt
Irepeatnur aufIntundStringanwendbar, Resultat istString
PI3 WS 20/21 28 [35]
Ü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
ISpätermehr.Vielmehr.
PI3 WS 20/21 29 [35]
Das Rechnen mit Zahlen
BeschränkteGenauigkeit,
konstanterAufwand ←→ beliebigeGenauigkeit, wachsenderAufwand Haskell bietet die Auswahl:
IInt- ganze Zahlen als Maschinenworte (≥31 Bit) IInteger- beliebig große ganze Zahlen IRational- beliebig genaue rationale Zahlen IFloat,Double- Fließkommazahlen (reelle Zahlen)
PI3 WS 20/21 30 [35]
Ganze Zahlen: Int und Integer
INützliche Funktionen (überladen, auch fürInteger):
+, ∗, ^, - :: Int→ Int→Int abs :: Int→ Int−− Betrag div, quot :: Int→ Int→Int mod, rem :: Int→ Int→Int Es gilt:(div x y)∗y + mod x y==x IVergleich durch==,6=,≤,<, . . . IAchtung:Unäres Minus
IUnterschied zum Infix-Operator- IIm Zweifelsfall klammern:abs (-34)
PI3 WS 20/21 31 [35]
Fließkommazahlen: Double
IDoppeltgenaue Fließkommazahlen (IEEE 754 und 854)
ILogarithmen, Wurzel, Exponentation,πunde, trigonometrische Funktionen IKonversion in ganze Zahlen:
IfromIntegral :: Int, Integer→Double
IfromInteger :: Integer→Double
Iround, truncate :: Double→Int, Integer
IÜberladungen mit Typannotation auflösen:
round (fromInt 10) :: Int
IRundungsfehler!
PI3 WS 20/21 32 [35]
Alphanumerische Basisdatentypen: Char
INotation für einzelneZeichen: ’a’,. . . INützlicheFunktionen:
ord :: Char →Int chr :: Int →Char toLower :: Char→Char toUpper :: Char→Char isDigit :: Char→Bool isAlpha :: Char→Bool
IZeichenketten: String DEMO
PI3 WS 20/21 33 [35]
Jetzt seit ihr noch mal dran.
IZIP-Datei mit den Quellen auf der Webseite verlinkt (RubrikVorlesung) IFür diese Vorlesung: eine DateiExamples.hsmit den Quellen der Funktionenfac,
repeatundstart.
IUnter der RubrikÜbung: Kurzanleitung PI3-Übungsbetrieb
IDurchlesen und Haskell Tool Stack installieren, Experimente ausprobieren, 0. übungsblatt angehen.
Übung 1.2: Mehr Sterne
Ändert die Funktionstarsso ab, dass sie eine Zeichenkette ausnSternchen zurückgibt.
PI3 WS 20/21 34 [35]
Zusammenfassung
IProgrammesindFunktionen, definiert durchGleichungen IReferentielle Transparenz
Ikeinimpliziter Zustand, keineveränderlichen Variablen
IAusführungdurchReduktionvon Ausdrücken ITypisierung:
IBasistypen: Zahlen, Zeichen(ketten), Wahrheitswerte IJede Funktionfhat eine Signaturf :: a→b
PI3 WS 20/21 35 [35]