Funktionen höherer Ordnung: Die Funktion map Die Funktion map

Werbung
Funktionen höherer Ordnung:
Die Funktion map
Programmiermuster: Anwendung einer Funktion auf jedes Element einer Liste; Ergebnis ist die Liste der Funktionswerte zu den Elementen
Funktionen sind Funktionen höherer Ordnung, wenn sie
• eine Funktion als Argument nehmen und/oder
mögliche Definitionen:
• eine Funktion als Wert zurückgeben.
• als Listenkomprehension:
Wiederkehrende Programmiermuster (pattern) lassen sich häufig als Funktionen höherer Ordnung abstrahieren.
map f xs = [ f x | x <- xs]
• direkt:
map f []
map f x:xs
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 77
Die Funktion map cont.
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 78
Programmiermuster Filtern:
Wiederkehrende Frage: welche Elemente einer Liste genügen einer gewünschten Eigenschaft?
• Typ von map
map :: (a -> b) -> [a] -> [b]
• Darstellung von Eigenschaften als Prädikate, d.h. als Funktionen vom Typ
t -> Bool für bel. Typ t
• Beispiele:
• Funktion filter nimmt ein Prädikat und eine Liste als Argument und gibt
die Liste derjenigen Elemente zurück, für die das Prädikat zutrifft
doubleAll xs = map double xs
double x = 2 * x
• mögliche Definition als Listenkomprehension:
convertChrs :: [Char] -> [Int]
convertChrs xs = map ord xs
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), = []
= f x : map f xs
filter p xs = [x | x <- xs, p x]
79
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 80
Programmiermuster Filtern:
Elementweises Verbinden von Listen: zip
• mögliche Definition direkt:
• zip: aus Paar von Listen mache Liste mit Paaren korrespondierender
Elemente; ignoriere „überschüssige“ Elemente ohne korrespondierenden
Partner
filter p []
= []
filter p x:xs = if p x then x:filter p xs
else filter p xs
•
• Typ von filter:
• Beispiel:
filter :: ( a -> Bool) -> [a] -> [a]
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), zip :: [a] -> [b] -> [(a,b)]
zip [4,7,1,1] "Koeln"
= [(4,’K’),(7,’o’),(1,’e’),(1,’l’)]
81
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 82
Elementweises Verbinden von Listen: zipWith
Anonyme Funktionen
• Verallgemeinerung zipWith: verknüpfe die korrespondierenden Elemente mit einer zweistelligen Funktion
• Funktionen als Argumente von Funktionen höherer Ordnung können einerseits durch ihren Namen referenziert werden
zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys
zipWith f
_
_
= []
• wird eine Funktion nur als Argument bei einer Anwendung einer Funktion
höherer Ordnung benötigt (und nirgends sonst), so reicht oft auch eine
sog.anonyme Funktion aus
• Beispiel:
• die Darstellung anonymer Funktionen erfolgt durch einen LambdaAusdruck mit der Syntax: (\<Var(s)> -> <Körper>)
sideBySide p1 p2 = zipWith (++) p1 p2
• Typ? :
• Beispiele: (\x -> x*x) oder (\x y --> x*x - 2*x*y + y*y)
zipWith ::
...................................
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 83
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 84
Herunterladen