Programmieren in Haskell - WS 2011/2012

Werbung
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
Herunterladen