Universität Bielefeld Programmieren in Haskell Sauthoff Programmieren in Haskell WS 2011/2012 Musik Higher Order Functions LambdaExpressions Currying Georg Sauthoff1 Universität Bielefeld AG Praktische Informatik 29. November 2011 1 [email protected] Higher Order Functions Musik Universität Bielefeld Programmieren in Haskell Sauthoff Musik Higher Order Functions LambdaExpressions Vorstellung der Musikabgaben aus den Tutorien. Currying Higher Order Functions foldr — sum Universität Bielefeld Programmieren in Haskell Example Sauthoff [1..5] = [1,2,3,4,5] = 1:2:3:4:5:[] : 1 Musik + 1 : Higher Order Functions LambdaExpressions + Currying 2 2 : Higher Order Functions + ⇒ 3 3 : 4 : 5 [] + 4 + 5 0 foldr — prod Universität Bielefeld · : Programmieren in Haskell Sauthoff 1 2 · 1 : Higher Order Functions · 2 : Musik LambdaExpressions ⇒ 3 Currying · 3 : Higher Order Functions 4 4 : 5 [] → (1 · (2 · (3 · (4 · (5 · 1))))) · 5 1 (1) foldr — length Universität Bielefeld : Programmieren in Haskell + Sauthoff 1 : 2 1 : + 1 Musik Higher Order Functions + LambdaExpressions ⇒ 3 : 1 Currying + Higher Order Functions 4 : 5 [] 1 + 1 0 → (1 + (1 + (1 + (1 + (1 + 0))))) (2) foldr — Wiederholung Universität Bielefeld Programmieren in Haskell Sauthoff Musik foldr (+) 0 list Higher Order Functions foldr (*) 1 list LambdaExpressions ... Weitere foldr-Beispiele: append (++) concat Currying Higher Order Functions Lambda-Expressions Universität Bielefeld Programmieren in Haskell Sauthoff Musik Lambda-Abstractions Lambda-Ausdrücke Anonyme Funktionen Higher Order Functions LambdaExpressions Currying Example 1 2 foldr (\ a b -> 1 + b ) 0 list foldr (\ _ b -> 1 + b ) 0 list Higher Order Functions Syntax Universität Bielefeld Programmieren in Haskell Sauthoff Musik Higher Order Functions Lambda-Ausdruck LambdaExpressions λpat1 . . . patn → expr (3) Currying Higher Order Functions 1 Bzw: \ pat1 ... patn -> expr Wiederholung: Pattern Universität Bielefeld Programmieren in Haskell Sauthoff Pattern sind: natürlichen Zahlen Werte Datentyp-Konstruktoren Wildcard: _ Pattern von mehrstelligen Konstruktoren müssen geklammert werden: Example 1 (\( x : xs ) -> x ) [4 ,3 ,2] Musik Higher Order Functions LambdaExpressions Currying Higher Order Functions Currying Universität Bielefeld Programmieren in Haskell Partielle Anwendung von Funktionen Sauthoff curryfiziert Musik geschönfinkelt Higher Order Functions gestaffelt LambdaExpressions Gestaffelte Sichtweise Currying Higher Order Functions λpat1 pat2 . . . patn → expr (4) λpat1 → λpat2 → . . . λpatn → expr (5) (λpat1 → (λpat2 → . . . (λpatn → expr))) (6) Bzw: Beispiele Example 1 2 > add : : I n t −> I n t −> I n t > add x y = x + y 3 4 5 > add ’ : : I n t −> ( I n t −> I n t ) > add ’ x y = x + y 6 7 8 > add ’ ’ : : I n t −> ( I n t −> I n t ) > add ’ ’ x = \ y −> x + y 9 10 11 > add ’ ’ ’ : : I n t −> ( I n t −> I n t ) > add ’ ’ ’ = \ x y −> x + y 12 13 14 > add ’ ’ ’ ’ : : I n t −> ( I n t −> I n t ) > add ’ ’ ’ ’ = \ x −> \ y −> x + y 15 16 17 > add ’ ’ ’ ’ ’ : : I n t −> I n t −> I n t > add ’ ’ ’ ’ ’ = \ x −> \ y −> x + y Universität Bielefeld Programmieren in Haskell Sauthoff Musik Higher Order Functions LambdaExpressions Currying Higher Order Functions Beispiele Universität Bielefeld Programmieren in Haskell Sauthoff Musik Higher Order Functions LambdaExpressions Typen: Siehe Hugs Currying Higher Order Functions Currying Universität Bielefeld Programmieren in Haskell Sauthoff Musik die verschiedenen Versionen von add haben den gleichen Typ → Denn -> (Function Constructor) ist rechtsassoziativ in Haskell Sichtweise: add ist eine einstellige Funktion, die eine Enstellige Funktion zurückliefert Higher Order Functions LambdaExpressions Currying Higher Order Functions Partielle Anwendung ohne Lambda Universität Bielefeld Programmieren in Haskell Sauthoff Musik Higher Order Functions 1 2 Example LambdaExpressions (1+) map (1+) [2 ,3 ,4] Currying Higher Order Functions Kein Curry? Universität Bielefeld Programmieren in Haskell Example 1 Sauthoff add (a , b ) = a + b Musik Higher Order Functions LambdaExpressions Ausweg: Currying 1 2 curry curry f x y :: (( a , b ) -> c ) -> a -> b -> c = f (x , y ) Higher Order Functions Andere Richtung: 1 2 uncurry :: ( a -> b -> c ) -> (( a , b ) -> c ) uncurry f p = f ( fst p ) ( snd p ) Beispiel: Siehe Projektion Fazit: Currying Universität Bielefeld Programmieren in Haskell In Haskell: Nomen est omen Funktionen sind “per-default” currifiziert → Funktion mit einem Argument, die . . . zurückgibt explizit nicht currifiziert: via Tupel Function-Combinator ist rechtsassoziativ Function-Application ist linksassoziativ: f a b vs. (f a) b So gesehen ist jede mehrstellige Funktion eine Higher-Order-Function. Sauthoff Musik Higher Order Functions LambdaExpressions Currying Higher Order Functions foldl Universität Bielefeld Programmieren in Haskell foo Sauthoff : e2 1 5 e2 e2 : 1 Musik Higher Order Functions e2 LambdaExpressions 4 e2 3 e2 e2 e1 1 2 2 foldl ⇐ : 3 foldr ⇒ : 4 : 5 [] 2 e2 Currying Higher Order Functions 3 e2 4 e2 5 e1 foldl-Definition Universität Bielefeld Programmieren in Haskell Sauthoff Musik 1 2 3 4 1 2 foldl :: ( b foldl e2 e1 where f f Alternativ: foldl e2 e1 foldl e2 e1 -> a -> b ) -> b -> [ a ] -> b xs = f xs e1 [] e = e ( x : xs ) e = f xs ( e2 e x ) Higher Order Functions LambdaExpressions Currying Higher Order Functions [] = e1 ( x : xs ) = foldl e2 ( e2 e1 x ) xs Unterschiede fold, foldr Universität Bielefeld Programmieren in Haskell Sauthoff Unterschiedliche Faltung Musik foldr klammert rechtsassoziativ: ((a1 · (a2 · (a3 · . . . · (an · e1 ))))) Higher Order Functions (7) LambdaExpressions Currying Higher Order Functions foldl klammert linksassoziativ: (((((e1 · a1 ) · a2 ) · a3 ) · . . .) · an ) (8) die Faltung von foldr entspricht der Datentypdefinition ggf. Platzbedarf Unterschiede fold, foldr Universität Bielefeld Programmieren in Haskell Sauthoff Musik Higher Order Functions Eigenschaft 1 LambdaExpressions foldr e2 e1 ( reverse x ) = foldl ( flip e2 ) e1 Currying x Beispiel siehe Tafel. Higher Order Functions foldl Beispiele Universität Bielefeld Programmieren in Haskell Sauthoff sum prod Musik Higher Order Functions and LambdaExpressions or Currying concat Higher Order Functions reverse ... Siehe Tafel. Zwischenfazit Universität Bielefeld Programmieren in Haskell Sauthoff Musik direkte Übertragung von formalen Rekursionsschemata Higher-Order-Functions: Kompakter Code Vermeidung von Redundanz Angabe des Wesentlichen Vermeidung des “first order fate” Higher Order Functions LambdaExpressions Currying Higher Order Functions