• Keine Ergebnisse gefunden

Fortgeschrittene Funktionale Programmierung

N/A
N/A
Protected

Academic year: 2022

Aktie "Fortgeschrittene Funktionale Programmierung"

Copied!
12
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Fortgeschrittene Funktionale Programmierung

1. Vorlesung

Janis Voigtl¨ander

Universit¨at Bonn

Wintersemester 2015/16

(2)

Allgemeines zur Vorlesung

Vorkenntnisse?

I DP-Vorlesung oder ¨aquivalent Organisation:

I kein Skript, nicht unbedingt immer Folien

I (zumindest mitunter) ¨Ubungen mit Rechner Technik:

I Haskell Platform, GHC

I Emacs (oder Leksah oder . . . )

I lhs2tex, literate programming

1

(3)

Definition

” Studienleistungen“

Zu Beginn des Semesters wird eine (funktionale) Programmieraufgabe gestellt, die zeitnah gel¨ost werden muss.

Im Laufe des Semesters gilt: An der H¨alfte der w¨ochentlichen Ubungstermine werden zur Pr¨¨ ufungszulassung herangezogene theoretische oder praktische Aufgaben gestellt. L¨osungen zu theoretischen Aufgaben sind im Vorfeld schriftlich abzugeben und auf Aufforderung in der ¨Ubungsstunde zu pr¨asentieren/diskutieren.

Praktische Aufgaben werden w¨ahrend der ¨Ubungsstunde am Rechner bearbeitet. Je Aufgabenblock ( ¨Ubungsstunde mit zur Pr¨ufungszulassung herangezogenen Aufgaben) gibt es eine bin¨are Entscheidung:

”bestanden“ bei>50% Aufgabenerfolg. Insgesamt m¨ussen 80% der Aufgabenbl¨ocke in diesem Sinne erfolgreich

bestanden werden.

Zum Ende der Vorlesungszeit hin gibt es ein praktisches Projekt (daf¨ur Reduzierung der Pr¨asenzstunden), dessen erfolgreiche

Bearbeitung ebenfalls Voraussetzung f¨ur die Pr¨ufungszulassung ist. 2

(4)

Zum Inhalt (etwa)

I weitere Exploration von FP-Sprachfeatures

I laziness vs. strictness (and impact on efficiency)

I Abstraktionsmechanismen, Typsystem

I Monaden, Haskell als

imperative“ Sprache

I beyond Haskell: Agda, Curry, Elm?

I functional algorithm design

I persistence, memoization

I DSLs

I Parserkombinatoren, QuickCheck, . . .

I Template Haskell, . . .

I semantics, reasoning, verification

I Lambda-Kalk¨ul, formale Semantikbeschreibung

I Beweistechniken, typbasiertes Schließen

I Programmtransformation

I real world FP

I interfacing, GUIs, Webprogrammierung

I Haskell ecosystem, Parallelprogrammierung, . . . ?

3

(5)

Haskell: Laziness + Purity

(6)

Zur Erinnerung: eine DP-Klausuraufgabe

Gegeben seien die folgenden Funktionsdefinitionen:

f:: [Int]→[Int]

f[ ] = [ ]

f(x:xs) = (gx) : (fxs) g:: Int→Int

g3=g4 gn=n+1

sowie die vordefinierten Funktionenheadund tail.

Notieren Sie die einzelnen Haskell-Auswertungsschritte f¨ur folgenden Ausdruck (bis zum Endergebnis, und unter genauer Beachtung von Haskells Auswertungsstrategie!):

head(tail(f[3,3+1])) =

=

=...

5

(7)

Und noch eine:

Gegeben sei die folgende Definition einer Funktion in Haskell:

fun:: Int→Int→Int funx y |x<4 =x

|x ==y =y+1

|otherwise=funy (fun(x+1) (y−1))

Geben Sie f¨ur die nachfolgenden Funktionsapplikationen jeweils an, ob die entsprechende Berechnung terminiert oder nicht. Geben Sie im Falle der Terminierung zudem das Resultat der Applikation an:

Applikation terminiert (mit Resultat) terminiert nicht fun4 5

fun4 6

6

(8)

Laziness, unendliche Listen

fiblist= [fibn|n ←[0. .]]

fib0=1 fib1=1

fibn=fib(n−2) +fib(n−1)

fiblist=1:1: [fiblist!! (n−2) +fiblist!! (n−1)

|n←[2. .]]

fiblist=1:1: [fiblist!!n+fiblist!! (n+1)

|n←[0. .]]

fiblist=1:1: [x+y|(x,y)←zip fiblist(tail fiblist)]

7

(9)

Allgemeine Memoisierung

fib:: Int→Int fibn|n<2=1

fibn =fib(n−2) +fib(n−1) Rekursiver

”Aufrufgraph“, f¨ur fib6:

memo:: (Int→Int)→(Int→Int) memof =g

wheregn =table!!n table= [f n|n←[0. .]]

>letmfib=memo fib

>mfib30

1346269 -- einige Sekunden

>mfib30

1346269 --

”sofort“

8

(10)

Allgemeine Memoisierung

fib:: Int→Int fibn|n<2=1

fibn =fib(n−2) +fib(n−1)

memo:: (Int→Int)→(Int→Int) memof =g

wheregn =table!!n table= [f n|n←[0. .]]

>letmfib=memo fib

>mfib30

1346269 -- einige Sekunden

>mfib30

1346269 --

”sofort“

8

(11)

Allgemeine Memoisierung – rekursiv

mfib=memo fib fib:: Int→Int fibn|n<2=1

fibn =mfib(n−2) +mfib(n−1)

>fib30

1346269 --

”sofort“

>fib30

1346269 --

”sofort“

”Aufrufgraph“ jetzt:

9

(12)

Laziness, Kompositionalit¨ at und Re-Use

Sch¨on kompositionell:

any:: (a→Bool)→[a]→Bool anyp=or◦(mapp)

Mit:

or:: [Bool]→Bool or=foldr(||) False wobei:

foldr:: (a→b→b)→b→[a]→b foldrf k [ ] =k

foldrf k (x:xs) =f x(foldrf k xs) Auswertung:

any even[1. .10ˆ6] =. . .

11

Referenzen

ÄHNLICHE DOKUMENTE

TCS | 05 Typklassen | SoSe 2020 26/82 Klassen &amp; Instanzen Kinds &amp; Konstruktorkl.. 0 Im GHC Defaulting: F¨ ur Zahlen ist dies der Typ Integer... , Klassenname n T V )

Impr¨ adikativer Polymorphismus: Typvariablen stehen auch f¨ ur polymorphe Typen (mit Quantoren!). Versuch \x -&gt; const (x True) (x 'A')

TCS | 07 Typisierung | SoSe 2020 2/108 Motivation Typen Typisierungsverfahren..

kein Zusammenhang zwischen Zero und Succ auch der unsinnige Typ Vec Bool String ist erlaubt Ursache: Kind von Vec ist zu allgemein: * -&gt; * -&gt; *. Wunsch-Kind: Nat -&gt; * -&gt;

I Tutorien: 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

werden gleichzeitig definiert (Rekursion!) I Namen f, y und Parameter (x) überlagern andere I Es gilt die Abseitsregel. I Deshalb: Auf gleiche Einrückung der lokalen

Da ϑ differen- zierbar und somit stetig ist, folgt die

Da der Vektor (1, 1, 1) T parallel zur Dreiecks- Ebene steht, steht der Normalenvektor der Dreiecksfl¨ ache senkrecht auf G und der Fluss ist