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: psteffen@techfak.uni-bielefeld.de 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 Werte Int Ganze Zahlen, -2147483648-2147483648 Integer Ganze Zahlen, unbeschränkte Genauigkeit Float Fliesskommazahlen 32 bit Double Fliesskommazahlen 64 bit Bool Wahrheitswerte, True/False Char Zeichen, a, b,... String Zeichenketten, Haskell Int -> Int Funktionen 17 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 1 Hugs installieren oder mit Techfak-Installation vertraut machen 2 Beispiele ausprobieren 24 Programmieren in Haskell