Programmieren in Haskell Einführung Peter Steffen Universität Bielefeld Technische Fakultät 17.10.2008 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/AuDIWS08/ → 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 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. 5 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) 6 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) 6 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) 6 Programmieren in Haskell Im Hugs... Main> answer 42 Main> yes True Main> greater False 7 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 Defintionen muss sich mindestens eine leere Zeile befinden. 8 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 9 Programmieren in Haskell Haskell-Typen Typ Int Integer Float Double Bool Char String Int -> Int 10 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 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 11 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 11 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 11 Programmieren in Haskell Im Hugs Main> square 5 25 Main> allEqual 1 1 2 False Main> maxi 23 117 117 12 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] 13 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] 13 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" 14 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" 14 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" 14 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] 15 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] 15 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] 15 Programmieren in Haskell Eure Aufgabe für diese Woche 16 1 Hugs installieren oder mit Techfak-Installation vertraut machen 2 Beispiele ausprobieren Programmieren in Haskell