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