Algorithmen und Datenstrukturen -- Einführung

Werbung
Lexik
Prelude
Algorithmen und Datenstrukturen – Einführung
Programmierung mit Haskell
D. Rösner
Institut für Wissens- und Sprachverarbeitung
Fakultät für Informatik
Otto-von-Guericke Universität Magdeburg
Winter 2008/2009, 27. Oktober 2008
D. Rösner
AuD 2008/2009 . . .
Lexik
Prelude
Gliederung
1
Lexik
2
Prelude
Listen
Weitere Funktionen
D. Rösner
AuD 2008/2009 . . .
Lexik
Prelude
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 2008/2009 . . .
Lexik
Prelude
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 2008/2009 . . .
Lexik
Prelude
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 2008/2009 . . .
Lexik
Prelude
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 2008/2009 . . .
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 2008/2009 . . .
Lexik
Prelude
Listen
Weitere Funktionen
Listenfunktionen:
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 2008/2009 . . .
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 2008/2009 . . .
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 2008/2009 . . .
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 2008/2009 . . .
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 2008/2009 . . .
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 2008/2009 . . .
Lexik
Prelude
Listen
Weitere Funktionen
Funktionen in Prelude.hs
Fehlererzeugung:
primitive error
:: String -> a
Beispiel einer Kontrollstruktur:
until
until p f x
:: (a -> Bool) -> (a -> a) -> a = if p x then x else until p f (
D. Rösner
AuD 2008/2009 . . .
Lexik
Prelude
Listen
Weitere Funktionen
Literatur (Auswahl):
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.
Graham Hutton.
Programming in Haskell.
Cambridge University Press, 2006.
ISBN 0521692695.
D. Rösner
AuD 2008/2009 . . .
Herunterladen