Programmieren in Haskell

Werbung
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Programmieren in Haskell
WS 2011/2012
Musik
Rechenstrategien
Typ-Inferenz
Higher Order
Functions
Georg Sauthoff1
Universität Bielefeld
AG Praktische Informatik
22. November 2011
1
[email protected]
Musik
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Musik
Rechenstrategien
Typ-Inferenz
Vorstellung der Musikabgaben aus den Tutorien.
Higher Order
Functions
Sieb-Beispiel
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Musik
Siehe Tafel (Auswertungsbeispiel)
Rechenstrategien
Typ-Inferenz
Higher Order
Functions
Sieb-Beispiel
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Musik
Siehe Tafel (Auswertungsbeispiel)
Rechenstrategien
Typ-Inferenz
Fortgeschrittenes
Melissa E. O’Neill. The genuine Sieve of Eratosthenes. J.
Funct. Program. 19(1). 2009
http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf
Higher Order
Functions
Hugs
Universität Bielefeld
Programmieren
in Haskell
Hugs> :set
Sauthoff
TOGGLES: groups begin with +/- to turn options on/off resp.
Musik
s
Print no. reductions/cells after eval
Rechenstrategien
[..]
Typ-Inferenz
Hugs>
Higher Order
Hugs> :set +s
Functions
Im Haskell Interpreter Hugs (und ghci) kann man sich die
Anzahl der internen Reduktionsschritte anzeigen lassen.
Hugs
Universität Bielefeld
Programmieren
in Haskell
Hugs> :set
Sauthoff
TOGGLES: groups begin with +/- to turn options on/off resp.
Musik
s
Print no. reductions/cells after eval
Rechenstrategien
[..]
Typ-Inferenz
Hugs>
Higher Order
Hugs> :set +s
Functions
Im Haskell Interpreter Hugs (und ghci) kann man sich die
Anzahl der internen Reduktionsschritte anzeigen lassen.
Diagnose
Benchmarking
Überprüfung
Hugs
Universität Bielefeld
Programmieren
in Haskell
Hugs> :set
Sauthoff
TOGGLES: groups begin with +/- to turn options on/off resp.
Musik
s
Print no. reductions/cells after eval
Rechenstrategien
[..]
Typ-Inferenz
Hugs>
Higher Order
Hugs> :set +s
Functions
Im Haskell Interpreter Hugs (und ghci) kann man sich die
Anzahl der internen Reduktionsschritte anzeigen lassen.
Diagnose
Benchmarking
Überprüfung
Achtung: Angaben sind implementationsspezifisch und
hängen von Optimierungen der Interpreter ab
Beispiel: siehe Projektion
Fazit Lazy Evaluation
Universität Bielefeld
Programmieren
in Haskell
Lazy Evaluation in Haskell:
leftmost-outermost + graph reduction
→ die Argumente von Funktionen werden erst berechnet
wenn sie benötigt werden
Sauthoff
Musik
Rechenstrategien
Typ-Inferenz
Higher Order
Functions
Fazit Lazy Evaluation
Universität Bielefeld
Programmieren
in Haskell
Lazy Evaluation in Haskell:
leftmost-outermost + graph reduction
→ die Argumente von Funktionen werden erst berechnet
wenn sie benötigt werden
Vorteile
bestimmte Algorithmen lassen sich sehr kompakt/elegant
implementieren
Arbeit mit unendlichen Datenstrukturen
Vermeidung von unnötigen Berechnungen
Sauthoff
Musik
Rechenstrategien
Typ-Inferenz
Higher Order
Functions
Fazit Lazy Evaluation
Universität Bielefeld
Programmieren
in Haskell
Nachteile
Overhead durch Laziness
→ Verwaltungsaufwand
automatische Optimierung nicht immer möglich
worst-case: Lazy-Auswertung von Ausdrücken die sowieso
vollständig ausgewertet werden müssen
Sauthoff
Musik
Rechenstrategien
Typ-Inferenz
Higher Order
Functions
Fazit Lazy Evaluation
Universität Bielefeld
Programmieren
in Haskell
Nachteile
Overhead durch Laziness
→ Verwaltungsaufwand
automatische Optimierung nicht immer möglich
worst-case: Lazy-Auswertung von Ausdrücken die sowieso
vollständig ausgewertet werden müssen
Lazy-Evaluation in anderen Programmiersprachen?
Sauthoff
Musik
Rechenstrategien
Typ-Inferenz
Higher Order
Functions
Fazit Lazy Evaluation
Universität Bielefeld
Programmieren
in Haskell
Nachteile
Overhead durch Laziness
→ Verwaltungsaufwand
automatische Optimierung nicht immer möglich
worst-case: Lazy-Auswertung von Ausdrücken die sowieso
vollständig ausgewertet werden müssen
Lazy-Evaluation in anderen Programmiersprachen?
durch explizite Kontrollstrukturen
Annotationen
...
Sauthoff
Musik
Rechenstrategien
Typ-Inferenz
Higher Order
Functions
Typ-Inferenz
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Musik
Rechenstrategien
Haskell Typsystem: strong, static
Inferenz
Unifikation
Typ-Inferenz
Higher Order
Functions
Typ-Inferenz
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Musik
Rechenstrategien
Haskell Typsystem: strong, static
Inferenz
Unifikation
Beispiel siehe Tafel
Typ-Inferenz
Higher Order
Functions
Wiederholung
Vorteile
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Typsystem kann einige Programmierfehler zur
Compile-Zeit finden
Musik
Rechenstrategien
Verkürzung des Fix-Compile-Run Zyklus
Verifikation
weniger Laufzeitfehler
Dokumentation
...
Typ-Inferenz
Higher Order
Functions
Wiederholung
Vorteile
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Typsystem kann einige Programmierfehler zur
Compile-Zeit finden
Musik
Rechenstrategien
Verkürzung des Fix-Compile-Run Zyklus
Verifikation
weniger Laufzeitfehler
Dokumentation
...
Fortgeschrittenes
Mark P. Jones. Typing Haskell in Haskell. Proceedings of the
1999 Haskell Workshop.
http://web.cecs.pdx.edu/~mpj/thih/thih.pdf (updated
version)
Typ-Inferenz
Higher Order
Functions
Higher Order Functions
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Funktionen höherer Ordnung
Funktionen die Funktionen als Parameter haben
Funktionen mit Funktionen als Rückgabewert
Musik
Rechenstrategien
Typ-Inferenz
Higher Order
Functions
Higher Order Functions
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Funktionen höherer Ordnung
Funktionen die Funktionen als Parameter haben
Funktionen mit Funktionen als Rückgabewert
In Haskell: Funktionen als “1st class citizens”
Musik
Rechenstrategien
Typ-Inferenz
Higher Order
Functions
Higher Order Functions
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Funktionen höherer Ordnung
Funktionen die Funktionen als Parameter haben
Funktionen mit Funktionen als Rückgabewert
In Haskell: Funktionen als “1st class citizens”
eine Menge von Funktionen ist ein “normaler” Datentyp
wie z.B. Int (eine Menge von natürlichen Zahlen)
einzelne Funktionen sind Werte aus dem Wertebereich von
einem Datentyp
Musik
Rechenstrategien
Typ-Inferenz
Higher Order
Functions
Wiederholung
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Musik
Rechenstrategien
1
Einfache Beispiele für Funktionen höherer Ordnung:
map :: (a - > b ) -> [ a ] -> [ b ]
2
3
filter :: ( a -> Bool ) -> [ a ] -> [ a ]
Typ-Inferenz
Higher Order
Functions
Wiederholung A&D: Strukturelle Rekursion
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Schema:
Musik
Rechenstrategien
f
:: [σ] -> τ
f []
=
e1
f (a : as)
=
e2
where s
=
f as
wobei e1 und e2 Ausdrücke vom Typ τ sind und e2 die
Variablen a, as und s (nicht aber f ) enthalten darf.
Typ-Inferenz
Higher Order
Functions
Beispiele
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Musik
Rechenstrategien
length
Typ-Inferenz
sum
Higher Order
Functions
prod
and
Beispiele
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Musik
Rechenstrategien
length
Typ-Inferenz
sum
Higher Order
Functions
prod
and
Beispiele siehe Tafel
Schema in Haskell
1
Rekursionschema der strukturellen Rekursion als higher-order
Function in Haskell:
pseudo code :
Programmieren
in Haskell
Sauthoff
Musik
Rechenstrategien
2
3
Universität Bielefeld
> strukrek e1 e2 input = ...
Typ-Inferenz
Higher Order
Functions
Schema in Haskell
1
Rekursionschema der strukturellen Rekursion als higher-order
Function in Haskell:
pseudo code :
1
2
3
4
5
Programmieren
in Haskell
Sauthoff
Musik
Rechenstrategien
2
3
Universität Bielefeld
> strukrek e1 e2 input = ...
Haskell Code:
foldr ’ :: ( a -> b -> b ) -> b -> [ a ] -> b
foldr ’ e2 e1 = f
where
f []
= e1
f ( x : xs ) = x ‘e2 ‘ f xs
Typ-Inferenz
Higher Order
Functions
Schema in Haskell
1
Rekursionschema der strukturellen Rekursion als higher-order
Function in Haskell:
pseudo code :
1
2
3
4
5
1
2
Programmieren
in Haskell
Sauthoff
Musik
Rechenstrategien
2
3
Universität Bielefeld
> strukrek e1 e2 input = ...
Haskell Code:
foldr ’ :: ( a -> b -> b ) -> b -> [ a ] -> b
foldr ’ e2 e1 = f
where
f []
= e1
f ( x : xs ) = x ‘e2 ‘ f xs
Oder:
foldr _ e1 []
= e1
foldr e2 e1 ( x : xs ) = e2 x ( foldr e2 e1 xs )
Typ-Inferenz
Higher Order
Functions
Beispiele mit foldr
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Musik
length
Rechenstrategien
Typ-Inferenz
sum
prod
and
or
Higher Order
Functions
Beispiele mit foldr
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Musik
length
Rechenstrategien
Typ-Inferenz
sum
prod
and
or
siehe Tafel
Higher Order
Functions
Herunterladen