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 . . .