Algorithmen und Datenstrukturen I Funktionen in Haskell: Faltung D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg c Winter 2009/10, 9. November 2009, 2009/10 D.Rösner D. Rösner AuD I 2009/10 . . . 1 Gliederung Herleitung foldr Beispiele D. Rösner AuD I 2009/10 . . . 2 Herleitung foldr Beispiele Funktionen höherer Ordnung: Falten einer Funktion f in eine nichtleere Liste Fälle: Falten von f in eine einelementige Liste [x] ergibt x Falten von f in eine längere Liste entspricht foldr1 f [e1 , e2 , . . . , ek −1 , ek ] = e1 ‘f‘ (e2 ‘f‘ ( . . . (ek −1 ‘f‘ ek ) . . . )) = e1 ‘f‘ (foldr1 f [e2 , . . . , ek −1 , ek ]) = f e1 (foldr1 f [e2 , . . . , ek −1 , ek ]) D. Rösner AuD I 2009/10 . . . 4 Herleitung foldr Beispiele Falten einer Funktion f cont. In Haskell: foldr1 f [x] = x foldr1 f (x:xs) = f x (foldr1 f xs) Typ: foldr1 :: (a -> a -> a) -> [a] -> a D. Rösner AuD I 2009/10 . . . 5 Herleitung foldr Beispiele Falten einer Funktion f cont. Beispiele: foldr1 (+) [4,7,1,1] => 13 foldr1 (||) [False, True, False] => True foldr1 (++) ["Dies ", "ist ", "ein ", "Beispiel!"] => "Dies ist ein Beispiel!" foldr1 max [4,7,1,1] => 7 foldr1 min [4,7,1,1] => 1 D. Rösner AuD I 2009/10 . . . 6 Herleitung foldr Beispiele Falten einer Funktion f cont. Verallgemeinerung: durch Angabe eines Werts s für die leere Liste lässt sich eine für alle endlichen Listen anwendbare Faltungsfunktion definieren foldr f s [] = s foldr f s x:xs = f x (foldr f s xs) D. Rösner AuD I 2009/10 . . . 8 Herleitung foldr Beispiele Falten einer Funktion f cont. Typ von foldr: foldr :: (a -> a -> a) -> a -> [a] -> a falls Wert für leere Liste von Typ b: foldr :: (a -> b -> b) -> b -> [a] -> b D. Rösner AuD I 2009/10 . . . 9 Herleitung foldr Beispiele Beispiele für mit foldr definierbare Standardfunktionen von Haskell concat :: [[a]] -> [a] concat xs = foldr (++) [] xs and :: [Bool] -> Bool and bs = foldr (&&) True bs rev :: [a] -> [a] rev xs = foldr snoc [] xs Dabei: snoc :: a -> [a] -> [a] snoc x xs = xs ++ [x] D. Rösner AuD I 2009/10 . . . 11 Herleitung foldr Beispiele Beispiele . . . cont. iSort :: [Int] -> [Int] iSort xs = foldr ins [] xs ins ins | | x [] = [x] x (y:ys) x<= y = x:(y:ys) otherwise = y: ins x ys D. Rösner AuD I 2009/10 . . . 12 Herleitung foldr Beispiele foldr1 vs. foldr Frage: Lässt sich foldr1 mit foldr definieren? Wenn ja, wie und unter welchen Bedingungen an f? foldr1 ................................... ................................... ................................... D. Rösner AuD I 2009/10 . . . 13 Herleitung foldr Beispiele induction mittels foldr Viele andere Funktionen lassen sich mittels foldr definieren. Frage: Wie lässt sich induction mit foldr definieren? induction base comb n = foldr ............ ................................... ................................... D. Rösner AuD I 2009/10 . . . 14 Herleitung foldr Beispiele Literatur: I Richard Bird. Introduction to functional programming using Haskell. Prentice Hall Europe, 2000. ISBN 0-13-484346-0; 2nd edition. Manual M. Chakravarty and Gabriele C. Keller. An Introduction to Computing with Haskell. Pearson Education Australia, 2002. ISBN 1 74009 404 2; also available in German translation. Simon Thompson. Haskell - The Craft of Functional Programming. Addison Wesley Longman Ltd., Essex, 1999. 2nd edition, ISBN 0-201-34275-8; Accompanying Web site: http://www.cs.ukc.ac.uk/people/staff/sjt/craft2e. D. Rösner AuD I 2009/10 . . . 15 Herleitung foldr Beispiele Literatur: II D. Rösner AuD I 2009/10 . . . 16