Algorithmen und Datenstrukturen I

Werbung
Gliederung
Algorithmen und Datenstrukturen I
Funktionen in Haskell: Faltung
Herleitung
foldr
Beispiele
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
D. Rösner AuD I 2009/10 . . .
Herleitung
foldr
Beispiele
Herleitung
foldr
Beispiele
Funktionen höherer Ordnung:
Falten einer Funktion f cont.
In Haskell:
Falten einer Funktion f in eine nichtleere Liste
Fälle:
foldr1 f [x]
Falten von f in eine einelementige Liste [x] ergibt x
Falten von f in eine längere Liste entspricht
= x
foldr1 f (x:xs) = f x (foldr1 f xs)
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 . . .
2
Typ:
foldr1 :: (a -> a -> a) -> [a] -> a
4
D. Rösner AuD I 2009/10 . . .
5
Herleitung
foldr
Beispiele
Herleitung
foldr
Beispiele
Falten einer Funktion f cont.
Falten einer Funktion f cont.
Verallgemeinerung:
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 . . .
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 . . .
6
Herleitung
foldr
Beispiele
8
Herleitung
foldr
Beispiele
Falten einer Funktion f cont.
Beispiele für mit foldr definierbare
Standardfunktionen von Haskell
concat :: [[a]] -> [a]
concat xs = foldr (++) [] xs
Typ von foldr:
foldr :: (a -> a -> a) -> a -> [a] -> a
and :: [Bool] -> Bool
and bs = foldr (&&) True bs
falls Wert für leere Liste von Typ b:
rev :: [a] -> [a]
rev xs = foldr snoc [] xs
foldr :: (a -> b -> b) -> b -> [a] -> b
Dabei:
snoc :: a -> [a] -> [a]
snoc x xs = xs ++ [x]
D. Rösner AuD I 2009/10 . . .
9
D. Rösner AuD I 2009/10 . . .
11
Herleitung
foldr
Beispiele
Herleitung
foldr
Beispiele
Beispiele . . . cont.
foldr1 vs. foldr
Frage: Lässt sich foldr1 mit foldr definieren?
Wenn ja, wie und unter welchen Bedingungen an f?
iSort :: [Int] -> [Int]
foldr1
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 . . .
D. Rösner AuD I 2009/10 . . .
12
Herleitung
foldr
Beispiele
Herleitung
foldr
Beispiele
induction mittels foldr
Literatur: I
Richard Bird.
Introduction to functional programming using Haskell.
Prentice Hall Europe, 2000.
ISBN 0-13-484346-0; 2nd edition.
Viele andere Funktionen lassen sich mittels foldr
definieren.
Frage: Wie lässt sich induction mit foldr definieren?
induction base comb n = foldr
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 . . .
13
14
D. Rösner AuD I 2009/10 . . .
15
Herleitung
foldr
Beispiele
Literatur: II
D. Rösner AuD I 2009/10 . . .
16
Herunterladen