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