Programmieren in Haskell Einführung - Technische Fakultät

Werbung
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
Herunterladen