Algorithmen und Datenstrukturen I

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