Kapitel 1 - Technische Fakultät

Transcription

Kapitel 1 - Technische Fakultät
Programmieren in Haskell
Einführung
Peter Steffen
Universität Bielefeld
Technische Fakultät
13.10.2010
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/AuDIWS10/
→ 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 1348 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
Die Typdeklaration kann auch weggelassen werden. Haskell ermittelt
dann selbst den Typ → Typinferenz
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 6 Elemente:
Main> take 6 "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