Algorithmen und Datenstrukturen I

Werbung
Algorithmen und Datenstrukturen I
Einführung in Haskell II
D. Rösner
Institut für Wissens- und Sprachverarbeitung
Fakultät für Informatik
Otto-von-Guericke Universität Magdeburg
c
Winter 2009/10, 19. Oktober 2009, 2009/10
D.Rösner
D. Rösner AuD I 2009/10 . . .
1
Gliederung
Lexik
Prelude
Listen
Weitere Funktionen
D. Rösner AuD I 2009/10 . . .
2
Lexik
Prelude
Listen
Weitere Funktionen
Haskell – lexikalische Konventionen
Identifikatoren: Bezeichner von Variablen, von Typen von
Funktionen usw.
Identifikatoren müssen in Haskell mit einem Buchstaben
beginnen
dieser kann von einer beliebigen Sequenz von
Buchstaben, Ziffern, Unterstrichen (_) und einzelnen
Anführungszeichen (’) gefolgt sein
D. Rösner AuD I 2009/10 . . .
4
Lexik
Prelude
Listen
Weitere Funktionen
Haskell – lexikalische Konventionen
Konventionen für führende Großbuchstaben bzw.
Kleinbuchstaben
alle Namen, die in Definitionen von Werten verwendet
werden (d.h. also auch alle Funktionsnamen), müssen mit
einem kleinen Buchstaben beginnen, ebenso die
Bezeichner für Variable und Typvariable
Beachte: Verwendung von _
einzeln: . . .
als erstes Zeichen gefolgt von Sequenz: . . .
mit einem Großbuchstaben beginnen Typnamen (z.B. Int),
Konstruktoren, True und False, Modulnamen und auch
die Namen von Typklassen
D. Rösner AuD I 2009/10 . . .
5
Lexik
Prelude
Listen
Weitere Funktionen
Haskell – lexikalische Konventionen
kleine Sammlung sog. reservierter Wörter
können nicht als Identifikatoren benutzt werden
dazu zählen:
case|class|data|default|deriving|do|else
|if|import|in|infix|infixl|infixr|instance
|let|module|newtype|of|then|type|where|_
D. Rösner AuD I 2009/10 . . .
6
Lexik
Prelude
Listen
Weitere Funktionen
Haskell – lexikalische Konventionen
Empfehlung: mnemonische, ’sprechende’ Namen
verwenden
z.B.
zinssatz
statt nur z
Empfehlung: bei Namen, die aus mehreren Worten
zusammengesetzt sind, den Beginn des zweiten Worts
(und ggf. folgender Wörter) in Großbuchstaben schreiben
z.B. letztesElement
D. Rösner AuD I 2009/10 . . .
7
Lexik
Prelude
Listen
Weitere Funktionen
Funktionen in Prelude.hs
Prelude.hs enthält viele nützliche Funktionen
/usr/local/hugs98-Dec2001/share/hugs/lib/Prelude.hs
D. Rösner AuD I 2009/10 . . .
9
Lexik
Prelude
Listen
Weitere Funktionen
Listenfunktionen im Prelude:
head
head (x:_)
:: [a] -> a
= x
last
last [x]
last (_:xs)
:: [a] -> a
= x
= last xs
tail
tail (_:xs)
:: [a] -> [a]
= xs
init
init [x]
init (x:xs)
:: [a] -> [a]
= []
= x : init xs
D. Rösner AuD I 2009/10 . . .
11
Lexik
Prelude
Listen
Weitere Funktionen
Listenfunktionen cont.
null
null []
null (_:_)
:: [a] -> Bool
= True
= False
(++)
[]
++ ys
(x:xs) ++ ys
:: [a] -> [a] -> [a]
= ys
= x : (xs ++ ys)
map
map f xs
:: (a -> b) -> [a] -> [b]
= [ f x | x <- xs ]
filter
filter p xs
:: (a -> Bool) -> [a] -> [a]
= [ x | x <- xs, p x ]
D. Rösner AuD I 2009/10 . . .
12
Lexik
Prelude
Listen
Weitere Funktionen
Listenfunktionen cont.
concat
concat
:: [[a]] -> [a]
= foldr (++) []
length
length
:: [a] -> Int
= foldl’ (\n _ -> n + 1) 0
(!!)
(x:_)
(_:xs)
(_:_)
[]
!!
!!
!!
!!
:: [a] -> Int -> a
0
= x
n | n>0 = xs !! (n-1)
_
= error "Prelude.!!: negative index"
_
= error "Prelude.!!: index too large"
D. Rösner AuD I 2009/10 . . .
13
Lexik
Prelude
Listen
Weitere Funktionen
Funktionen in Prelude.hs
Funktionen, die ein Paar als Argument nehmen, vs.
Funktionen mit zwei Argumenten
curry
curry f x y
:: ((a,b) -> c) -> (a -> b -> c)
= f (x,y)
uncurry
uncurry f p
:: (a -> b -> c) -> ((a,b) -> c)
= f (fst p) (snd p)
D. Rösner AuD I 2009/10 . . .
15
Lexik
Prelude
Listen
Weitere Funktionen
Funktionen in Prelude.hs cont.
id
id
x
:: a -> a
= x
const
const k _
:: a -> b -> a
= k
(.)
(f . g) x
:: (b -> c) -> (a -> b) -> (a -> c)
= f (g x)
flip
flip f x y
:: (a -> b -> c) -> b -> a -> c
= f y x
D. Rösner AuD I 2009/10 . . .
16
Lexik
Prelude
Listen
Weitere Funktionen
Funktionen in Prelude.hs: Faltung
foldl
:: (a -> b -> a) -> a -> [b] -> a
foldl f z []
= z
foldl f z (x:xs) = foldl f (f z x) xs
foldr
:: (a -> b -> b) -> b -> [a] -> b
foldr f z []
= z
foldr f z (x:xs) = f x (foldr f z xs)
...
D. Rösner AuD I 2009/10 . . .
17
Lexik
Prelude
Listen
Weitere Funktionen
Funktionen in Prelude.hs
Fehlererzeugung:
primitive error
:: String -> a
Beispiel einer Kontrollstruktur:
until :: (a -> Bool) -> (a -> a) -> a -> a
until p f x
= if p x then x
else until p f (f x)
D. Rösner AuD I 2009/10 . . .
18
Lexik
Prelude
Listen
Weitere Funktionen
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.
D. Rösner AuD I 2009/10 . . .
19
Lexik
Prelude
Listen
Weitere Funktionen
Literatur: II
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 . . .
20
Herunterladen