• Keine Ergebnisse gefunden

Was ist Funktionale Programmierung?

N/A
N/A
Protected

Academic year: 2022

Aktie "Was ist Funktionale Programmierung?"

Copied!
5
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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

(2)

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

Ausgabe

pi3-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]

(3)

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:EingabeAusgabe 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

(4)

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]

(5)

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]

Referenzen

ÄHNLICHE DOKUMENTE

Schwere Behinderung verstehen wir im Sinne kognitiver, körperlicher und kommunikativer Einschränkungen. Dieser Personenkreis wird in der Geistigbehindertenpädagogik häufig vergessen,

Beweisen Sie die folgende Aussage sowohl durch Fallunterscheidung als auch mit Kon- traposition: Sei mindestens eine von zwei natürlichen Zahlen nicht durch 3 teilbar, dann ist

Zeigen Sie durch doppeltes Abzählen und Verwendung des Schubfachprinzips, dass es mindestens eine Aufgabe gibt, die von mindestens 4 Studenten bearbeitet wurde2.

Be- rechnen Sie die Wahrscheinlichkeit dafür, dass beide gezogenen Karten von der Far- be Herz sind oder eine Dame und ein König gezogen wird unter der Voraussetzung, dass eine

Es sei X die Summe der Zahlwerte von zwei zufällig ausgewählten Kugeln, wobei jede Auswahl als gleichwahrscheinlich angenommen wird.. (a) Berechnen Sie Erwartungswert

Sei z(n) die Anzahl solcher Wörter, in denen keine zwei a's hintereinander stehen. Stellen Sie eine Rekursionsgleichung für z(n) auf und formulieren Sie

(c) Der Hyperwürfel Q n = (V, E) hat als Knotenmenge alle 0 −1− Folgen der Länge n, wobei zwei Knoten durch eine Kante verbunden sind, wenn sich die entsprechenden Folgen genau an

Eine Boolsche Formel f habe in der konjunktiven Normalform die Eigenschaft, dass jede Klausel 3 Literale (von paarweise verschiedenen Variablen) enthält, während jede Variable