Funktionen höherer Ordnung

Werbung
Funktionale Programmierung
Funktionen höherer Ordnung
Eine Funktion wird als Funktion höherer Ordnung
bezeichnet, wenn Funktionen als Argumente verwendet
werden, oder wenn eine Funktion als Ergebnis zurück
gegeben wird.
Beispiel:
twoTimes :: ( a -> a ) -> a -> a
twoTimes f x = f ( f x )
Anwendung:
twoTimes quadrat 3 => quadrat (quadrat 3) => 81
Prof. Dr. Margarita Esponda
Funktionale Programmierung
Funktionen höherer Ordnung
Typische Beispielsfunktion:
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
map f
[2, 3, 6, 0]
=> [f(2), f(3), f(6), f(0)]
Die Funktion f wird auf jedes Element der Liste angewendet
map (^2) [2, 3, 6, 0]
Prof. Dr. Margarita Esponda
=> [4, 9, 36, 0]
Funktionale Programmierung
Funktionen höherer Ordnung
Die filter-Funktion
Die filter-Funktion soll aus einer Liste nur die
Elemente auswählen, die eine bestimmte Bedingung
erfüllen.
Beispiel:
filter (<3) [2,5,0,1,7]
Prof. Dr. Margarita Esponda
=>
[2,0,1]
Funktionale Programmierung
Funktionen höherer Ordnung
Die filter-Funktion
1. Definition:
filter :: (a -> Bool) -> [a] -> [a]
filter p [] = []
filter p (x:xs)
Bedingung
Prof. Dr. Margarita Esponda
| p x = x : filter p xs
| otherwise = filter p xs
Funktionale Programmierung
Funktionen höherer Ordnung
takeWhile-Funktion
So lange eine Bedingung erfüllt wird, werden Elemente aus
einer Liste genommen.
takeWhile :: (a → Bool) → [a] → [a]
takeWhile p [] = []
takeWhile p (x:xs)
| p x = x : takeWhile p xs
| otherwise = []
Beispiel:
takeWhile (<9)
Prof. Dr. Margarita Esponda
[2, 5, 7, 9, 11]
=>
[2, 5, 7]
Funktionale Programmierung
Funktionen höherer Ordnung
dropWhile-Funktion
So lange eine Bedingung erfüllt wird, werden Elemente aus
einer Liste gelöscht.
dropWhile :: (a → Bool) → [a] → [a]
dropWhile p [] = []
dropWhile p (x:xs)
| p x = dropWhile p xs
| otherwise = x:xs
Beispiel:
dropWhile
Prof. Dr. Margarita Esponda
isSpace
"
Hello"
=>
"Hello"
Funktionale Programmierung
Funktionen höherer Ordnung
zip-Funktion
zip :: [a] → [b] → [(a,b)]
zip (x:xs) (y:ys)
= (x,y) : zip xs ys
zip
= []
_
_
Die zip-Funktion kombiniert die Elemente aus zwei
Listen und liefert eine Liste von Tupeln zurück.
Beispiel:
zip [1..] ["abcd"] ⇒ [(1,'a'), (2,'b'), (3,'c'), (4,'d')]
Prof. Dr. Margarita Esponda
Funktionale Programmierung
Funktionen höherer Ordnung
zipWith-Funktion
Die zipWith-Funktion bekommt zwei Listen und eine
Funktion als Parameter und berechnet eine neue Liste,
indem jeweils die Elemente der beiden Listen mit der
angegebenen Funktion verknüpft werden.
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith f (x:xs) (y:ys) = (f x y):(zipWith f xs ys )
zipWith f _ _ = []
Beispiel:
zipWith (^) [1, 2, 3] [0, 3, 2]
Prof. Dr. Margarita Esponda
⇒
[1, 8, 9]
Funktionale Programmierung
Arithmetische Sequenzen
Mit Hilfe des
..
Operators lassen sich in Haskell sehr elegant
Zahlensequenzen erzeugen.
[ 1 .. 5 ]
=> [1,2,3,4,5]
[ 0, 5 .. 21]
=> [ 0, 5, 10, 15, 20 ]
[ 10, 8 .. 0 ]
=> [ 10, 8, 6, 4, 2, 0 ]
[ 10 .. 1 ]
=> []
[ 1 .. ]
=> unendliche Liste
take 5 [2, 0 .. ]
=> [ 2, 0, -2, -4, -6 ]
…
Prof. Dr. Margarita Esponda
Funktionale Programmierung
Funktionen höherer Ordnung
Eine andere Definition der map-Funktion mit
Listen-Generatoren ist:
map :: (a -> b) -> [a] -> [b]
map f xs = [ f x | x<-xs ]
Anwendung:
map length ["Eins", "Zwei", "Drei", "Vier"] => [4, 4, 4, 4]
Prof. Dr. Margarita Esponda
Funktionale Programmierung
Listen-Generatoren
Die Syntax von Listengeneratoren in Haskell ist sehr
ähnlich zu dem, was wir für die Definition von Mengen
in der Mathematik kennen.
Mathematik:
{ x | x ∈ { 1 .. 20 }, (x mod 3) = 0 }
{
x x ∈Ν,
x 3 ≤ 100
}
Menge aller Zahlen, die genau durch 3 geteilt
werden können
Prof. Dr. Margarita Esponda
Funktionale Programmierung
Listen-Generatoren
Haskell:
[ x | x <- [1 .. 20], (mod x 3)==0 ]
damit gibt man Haskell die Anweisung, eine Liste zu bilden aus
allen Elementen, die genau durch 3 geteilt werden können:
sollen dabei mehrere Bedingungen erfüllt werden, so müssen diese
durch Komma getrennt sein.
Im Unterschied zu der mathematischen Definition von Mengen
können Haskell-Listen sich wiederholende Elemente beinhalten.
Prof. Dr. Margarita Esponda
Funktionale Programmierung
Listen-Generatoren
Allgemeine Form:
[ body | qualifiers ]
Beispiele:
[ n*n | n <- [1..100] ]
factors n = [ i | i <- [1..n], (n `mod` i) == 0 ]
2. Definition der filter-Funktion:
filter :: (a -> Bool) -> [a] -> [a]
filter p xs = [ x | x <- xs, p x ]
Prof. Dr. Margarita Esponda
Funktionale Programmierung
Sieb des Eratosthenes
3. Jahrhundert v. Chr.
Das Sieb des Eratosthenes ist ein sehr bekannter Algorithmus, der für
ein vorgegebenes N alle Primzahlen findet, die kleiner gleich N sind.
Der Algorithmus verwendet ein Feld p aus booleschen Werten, mit dem
Ziel, dem Element p[i] den Wert 1 zuzuweisen, falls i eine Primzahl ist, und
anderenfalls den Wert 0.
Ziel:
P P
P
Prof. Dr. Margarita Esponda
P
P
P
1
2
3
4
5
6
7
8
9
0
1
1
0
1
0
1
0
0
10
11
0
1
Funktionale Programmierung
Sieb des Eratosthenes
Anfang:
1
1
1
1
1
1
1
1
1
1
2
3
4
5
6
7
8
9
0
1
1
0
1
1
0
1
1
0
1
1
1
0
2
1
3
1
Prof. Dr. Margarita Esponda
4
0
5
1
6
0
7
1
8
0
9
0
1
1
10
0
1
10
0
1
11
1
11
1
1
12
0
1
12
0
1
13
1
13
1
1
14
0
1
14
0
1
15
1
15
0
1
1
16
0
1
16
0
1
17
1
17
1
1
18
0
1
18
0
1
19
1
19
1
1
20
0
1
20
0
1
21
1
21
0
1
Funktionale Programmierung
Sieb des Eratosthenes
1
0
1
0
2
3
1
2
1
3
1
1
4
0
4
0
5
1
5
1
6
0
6
0
7
1
7
1
8
0
8
0
9
10
0
0
9
10
0
0
11
1
11
1
12
0
12
0
13
1
13
1
14
15
0
14
0
15
0
0
16
0
16
0
17
1
17
1
18
0
18
0
19
1
19
1
20
0
20
0
0
2
3
1
1
4
0
5
1
6
0
7
1
8
0
nur bis N/2
noch besser ist nur bis
Prof. Dr. Margarita Esponda
9
10
0
0
2
N
11
1
12
0
13
1
14
0
0
21
0
N
nicht mehr!
1
21
15
0
16
0
17
1
18
0
19
1
20
0
21
0
Funktionale Programmierung
Sieb des Eratosthenes
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
2 3
5 7 9 11 13 15 17 19 21 23
2 3
5 7 11 13 17 19 23
2 3
5 7 11 13 17 19 23
2 3
5 7 11 13 17 19 23
2 3
5 7 11 13 17 19 23
2 3
5 7 11 13 17 19 23
2 3
5 7 11 13 17 19 23
2 3
5 7 11 13 17 19 23
Prof. Dr. Margarita Esponda
Funktionale Programmierung
Listen-Generatoren
primzahlen :: Integer → [Integer]
primzahlen
n = sieb [2..n]
where
sieb [] = []
sieb (p:xs) = p: sieb [k | k<-xs, k `mod` p>0]
primzahlen :: Integer → [Integer]
primzahlen
= sieb [2..]
where
sieb (p:xs) = p:sieb[k | k<-xs, k `mod` p>0]
Prof. Dr. Margarita Esponda
Funktionale Programmierung
Funktionen höherer Ordnung
all-Funktion
Entscheidet, ob alle Elemente einer Liste eine
gegebene Bedingung erfüllen.
all :: (a → Bool) → [a] → Bool
all p xs = and [p x | x ← xs]
Beispiel:
all even [2 ,4 ,6 ,8]
all (==3)
Prof. Dr. Margarita Esponda
=> True
[3,4,3,0,3] => False
Funktionale Programmierung
Funktionen höherer Ordnung
any-Funktion
Entscheidet, ob mindestens ein Element einer Liste
eine gegebene Bedingung erfüllt.
any :: (a → Bool) → [a] → Bool
any p xs = or [p x | x ← xs]
Beispiel:
any even [2 ,3 ,6 ,8]
=> True
any (==3) [3,4 ,3 ,0 ,3] => True
Prof. Dr. Margarita Esponda
Herunterladen