Programmieren in Haskell Einführung Peter Steffen Universität Bielefeld Technische Fakultät 16.10.2009 1 Programmieren in Haskell Veranstalter Dr. Peter Steffen Raum: M3-124 Tel.: 0521/106-2906 Email: [email protected] 2 Programmieren in Haskell Hinweise zu den Vorlesungen Hinweise zu den Vorlesungen “Algorithmen & Datenstrukturen I” und “Programmieren in Haskell” findet Ihr hier: http://www.techfak.uni-bielefeld.de/ags/pi/lehre/AuDIWS09/ → Folien als pdf → Übungsblätter → Hinweise zur Haskell-Installation 3 Programmieren in Haskell Programmiersprachen imperative Programmiersprachen: Pascal, C, Fortran, ... Objektorientierte Programmiersprachen: Java, C++, Smalltalk, Delphi, ... Funktionale Programmiersprachen: Haskell, Lisp, Miranda, Standard ML, ... Logische Programmiersprachen: Prolog 4 Programmieren in Haskell 99 Bottles of Beer Die Internetseite http://99-bottles-of-beer.net/ enthält Programme in insgesamt 1304 unterschiedlichen Programmiersprachen, die den 99 Bottles of Beer -Song ausgeben. Ein guter Überblick über die verschiedenen Programmiersprachen! 5 Programmieren in Haskell 99 Bottles of Beer – Text 99 bottles of beer on the wall, 99 bottles of beer. Take one down and pass it around, 98 bottles of beer on the wall. 98 bottles of beer on the wall, 98 bottles of beer. Take one down and pass it around, 97 bottles of beer on the wall. 97 bottles of beer on the wall, 97 bottles of beer. Take one down and pass it around, 96 bottles of beer on the wall. .... 1 bottle of beer on the wall, 1 bottle of beer. Take one down and pass it around, no more bottles of beer on the wall. No more bottles of beer on the wall, no more bottles of beer. Go to the store and buy some more, 99 bottles of beer on the wall. 6 Programmieren in Haskell 99 Bottles of Beer – Pascal 7 Programmieren in Haskell 99 Bottles of Beer – C 8 Programmieren in Haskell 99 Bottles of Beer – Java 9 Programmieren in Haskell 99 Bottles of Beer – Haskell 10 Programmieren in Haskell Haskell benannt nach dem amerikanischen Logiker Haskell B. Curry entwickelt seit 1987 funktionale Programmiersprache Haskell-Homepage: http://haskell.org/ Implementierungen: Haskell-Interpreter hugs: http://www.haskell.org/hugs/. Diesen verwenden wir in der Vorlesung und in den Übungen. Verfügbar für Unix, Linux, Windows, MacOSX. Haskell-Compiler ghc: http://www.haskell.org/ghc/ Haskell-Compiler nhc98: http://haskell.org/nhc98/ Jeweils zum kostenlosen Download. 11 Programmieren in Haskell Warum Haskell? Haskell ist eine funktionale Programmiersprache. Für einen Informatiker ist es sinnvoll, unterschiedliche Arten von Programmiersprachen kennenzulernen. Haskell ist eine recht einfache Sprache. Man kann schnell relativ komplizierte Algorithmen formulieren, ohne viel von der Sprache gelernt zu haben. Haskell wird in Schulen kaum gelehrt. Insofern haben fast alle Studienanfänger die gleiche Ausgangsbasis. Haskell ist die am weitesten verbreitete funktionale Programmiersprache 12 Programmieren in Haskell Ein bißchen Haskell Ein Haskell-Programm besteht aus einem oder mehreren Modulen Ein Modul besteht aus Typdeklarationen und Definitionen answer :: Int answer = 42 - - Typdeklaration - - Definition yes :: Bool yes = True greater :: Bool greater = (answer > 71) 13 Programmieren in Haskell Im Hugs... Main> answer 42 Main> yes True Main> greater False 14 Programmieren in Haskell Haskell-Module Haskell-Script: Endung .hs, Kommentare werden mit - - eingeleitet Literate-Haskell-Script: Endung .lhs, alles ist Kommentar, nur Zeilen, die mit > beginnen, gehören zum Programm. Zum Beispiel: Definition fuer answer: > answer :: Int > answer = 42 Defintion fuer yes: > yes :: Bool > yes = True Zwischen Kommentaren und Definitionen muss sich mindestens eine leere Zeile befinden. 15 Programmieren in Haskell Bedienung vom hugs Aufrufen mit hugs <Modulname> Laden eines neuen Moduls: :l <Modulname> Erneutes Laden eines Moduls nach einer Änderung: :r Den Typ eines Ausdrucks anzeigen: :t <Ausdruck> Alle verfügbaren Kommandos anzeigen: :? hugs beenden: :q 16 Programmieren in Haskell Haskell-Typen Typ Int Integer Float Double Bool Char String Int -> Int 17 Werte Ganze Zahlen, -2147483648 - 2147483648 Ganze Zahlen, unbeschränkte Genauigkeit Fliesskommazahlen 32 bit Fliesskommazahlen 64 bit Wahrheitswerte, True/False Zeichen, ’a’, ’b’, ... Zeichenketten, ”Haskell” Funktionen Programmieren in Haskell Int vs. Integer > fakInt :: Int -> Int > fakInt 0 = 1 > fakInt n = n * fakInt (n-1) Main> fakInt 20 -2102132736 > fakInteger :: Integer -> Integer > fakInteger 0 = 1 > fakInteger n = n * fakInteger (n-1) Main> fakInteger 20 2432902008176640000 18 Programmieren in Haskell Ein weiteres Beispiel square :: Int -> Int square x = x*x allEqual :: Int -> Int -> Int -> Bool allEqual n m p = (n==m) && (m==p) maxi :: Int -> Int -> Int maxi n m | n >= m = n | otherwise = m 19 Programmieren in Haskell Im Hugs Main> square 5 25 Main> allEqual 1 1 2 False Main> maxi 23 117 117 20 Programmieren in Haskell Ein ziemlich ausgefeiltes Beispiel, das Ihr jetzt noch nicht verstehen müsst qsort :: (Ord a) => [a] -> [a] qsort [] = [] qsort (a:as) = qsort [b | b <- as, b < a] ++ [a] ++ qsort [ b | b <- as, b >= a] Main> qsort [1,4,2,2,4] [1,2,2,4,4] 21 Programmieren in Haskell Listenkonkatenation Hugs.Base> [1,4,2] ++ [2,4] [1,4,2,2,4] Zeichenketten (Strings) sind auch Listen: Hugs.Base> "Haskell " ++ "ist " ++ "toll!" "Haskell ist toll!" Main> qsort "Haskell ist toll!" " !Haeikllllosstt" 22 Programmieren in Haskell Coole Sachen mit Listen Die ersten 7 Elemente: Main> take 7 "Robert Giegerich" "Robert" Unendliche (!) Listen: Main> [1..] [1,2,3,4,5,6,7,8,9,10,11, Die ersten 4 natürlichen Zahlen (!!): Main> take 4 [1..] [1,2,3,4] 23 Programmieren in Haskell Eure Aufgabe für diese Woche 24 1 Hugs installieren oder mit Techfak-Installation vertraut machen 2 Beispiele ausprobieren Programmieren in Haskell