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: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 77 Die Funktion map cont. c Prof. Dr. D. Rösner; erstellt: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 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: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), = [] = f x : map f xs filter p xs = [x | x <- xs, p x] 79 c Prof. Dr. D. Rösner; erstellt: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 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: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 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: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 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: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 83 c Prof. Dr. D. Rösner; erstellt: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 84