Programmieren in Haskell

Werbung
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Programmieren in Haskell
Administratives
Programmierspr
WS 2011/2012
Georg Sauthoff1
Universität Bielefeld
AG Praktische Informatik
November 10, 2011
1
[email protected]
Haskell
Kontakt
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Dr. Georg Sauthoff
Email: [email protected]
M3-128
Programmieren in Haskell
Organisation der Übungen zu A&D und Programmieren in
Haskell
http://www.techfak.uni-bielefeld.de/ags/pi/lehre/
AuDIWS11/
Zentrale Seite für Übungszettel, Folien, usw.
Administratives
Programmierspr
Haskell
Übungen
Universität Bielefeld
Programmieren
in Haskell
„Übungen zu Algorithmen und Datenstrukturen“sind die
Übungen zu den beiden Veranstaltungen:
Algorithmen & Datenstrukturen (Prof. Dr. Giegerich)
Programmieren in Haskell (Dr. Georg Sauthoff)
Scheinkriterien:
≥ 50 % der Punkte
aktive Teilnahme an den Übungen
Bearbeitung in 2er- bzw. 3er-Gruppen
Anmeldung
http://www.techfak.uni-bielefeld.de/ags/pi/lehre/
AuDIWS11/gruppen.pdf
Sauthoff
Administratives
Programmierspr
Haskell
Prüfung
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Programmierspr
Haskell
Voraussetzung: Erfolgreiche Teilnahme an der Übungen
Mündliche Prüfung (ca. 20 Minuten)
mögliche Termine werden noch bekanntgegeben
Skript
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Programmierspr
Es gibt ein Vorlesungsskript zu den beiden Veranstaltungen:
http://www.techfak.uni-bielefeld.de/ags/pi/lehre/
AuDIWS11/literatur_aud.html
Im Laufe des Semesters werden nach Bedarf noch gedruckte
Skripte zur Verfügung gestellt.
Haskell
Uhrzeit
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Programmierspr
Haskell
Statt 8h c.t. ⇒ 8.30 s.t.? Nein, es bleibt bei 8h c.t.
Ideengeschichte der Programmiersprachen
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Welche Programmiersprachenparadigmen?
Administratives
Historische Entwicklung
Programmierspr
Wie ist Haskell einzuordnen?
Haskell
Visualisierungen
O’Reilly Poster:
http://oreilly.com/news/languageposter_0504.html
Computer Languages History:
http://www.levenez.com/lang/
Maschinennahe Sprachen
Universität Bielefeld
Programmieren
in Haskell
Welche Maschinen?
Konventionelle Rechnenmaschinen
Sauthoff
festverdrahtet
keine Software
Administratives
Programmierspr
1941: Zuse Z3
elektromechanisch (Relais!)
2 Register
200 Byte RAM
programmierbar (Lochstreifen)
aber: kein Sprungbefehl
1945 Von-Neumann-Architektur
Sprungbefehl!
Universelle Rechenmaschine
Keine Trennung von Programm und
Daten
Haskell
Quelle: http://commons.
wikimedia.org/wiki/File:
Z3_Deutsches_Museum.JPG,
CC-by-SA 3.0
Übliche Rechner-Architektur
Universität Bielefeld
Programmieren
in Haskell
Labels Adressen
RAM
Sauthoff
Register
Administratives
Programcounter
Programmierspr
start:
500
add R1, R2
612
613
cmp R2, 0
cjmp start
Daten
R1
42
R2
13
Haskell
+ 42
Maschinennahe Sprachen
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Von Binärcode zu Assembler-Sprachen:
Administratives
Symbolische OP-codes
Programmierspr
Symbolische Adressen
Haskell
stack
Subroutinen
relocatable code
indirekte adressierung
→ Programme überhaupt nicht portabel
⇒ Höhere Programmiersprachen (imperativ)
Imperative Programmiersprachen
Bis heute der Mainstream
Weiterführung der Assembler-Ideen
nah am Maschinenmodell
1957 Fortran
FORmula TRANslation
zunächst definiert durch die Fähigkeiten des Compilers
ALGOL 60
systematisch konstruierte Sprache
maschinenunabhängig
präzise Syntaxdefinition (CFG)
Strenge Typisierung
Arrays
Verschachtelte Sichtbarkeitsbereiche, Blockstruktur
Prozeduren
Rekursion, Schleifen, . . .
Input/Output?
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Programmierspr
Haskell
Funktionale Programmiersprachen
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
FP als neues Programmierparadigma
1958 LISP
LISt Processing
alles ist eine Liste, auch die Programme
Funktionen als universelle Kontrollstruktur, z.B.
(COND (EQUAL x y) (PLUS x 1)(Minus y 1))
if (x = y) then x+1 else y+1
Einfache Semantik durch Interpreter in LISP
(fast) untypisiert
moderne Variante: SCHEME
Administratives
Programmierspr
Haskell
Logische Programmiersprachen
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
1972 Prolog
Programmierspr
Menge von Fakten
Haskell
Menge von Regeln
Inferenz-Algorithmus
Programmablauf: Auswertung einer Abfrage
wie funktionale Programmiersprachen, Teil der Gruppe der
deklarativen Programmiersprachen
Ada-Projekt
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
DOD-Projekt
Entwicklung 1979-1983
Ziel: Aufräumen mit dem Sprachendurcheinander
Universal-Sprache
→ Steigerung der Wiederverwendbarkeit von Software
Komplexe Sprache
Verbot von Sprach-Subsets
⇒ keine Verbreitung
Administratives
Programmierspr
Haskell
Gegenläufiger Trend
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Kleine, einfache Sprachen
C (1970)
Pascal (1972)
C++ (1979)
Kompatibilität mit C
OOP
templates
Überladung
...
Administratives
Programmierspr
Haskell
Objekt-orientierte Programmierung (OOP)
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Simula 67: ALGOL + Klassen
Klasse = Funktion/Prozedur mit Gedächtnis
1972 Smalltalk
Klassen und Methoden
Vererbung
Byte-Code Interpreter
Klassen-Bibliothek
1979 C++
Programmierspr
Haskell
Anwendungsspezifische Sprachen
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
sed
Administratives
awk
Programmierspr
sh
Haskell
make
bibtex
LaTeX
Postscript (Druckseitenbeschreibung)
SGML, HTML (Dokumentenbeschreibung)
...
Heute
Universität Bielefeld
Programmieren
in Haskell
Es gibt immer noch die alten Sprachen:
Fortran (ISO 2010) — nun auch OO
LISP
C (ISO C99)
C++ (ISO 2011)
Ada (ISO 2005)
Imperativer/OOP Mainstream:
Java, C#, C, C++
Funktionaler Mainstream:
Haskell, ML, LISP
Scriptsprachen:
Python, Ruby . . .
Sauthoff
Administratives
Programmierspr
Haskell
Haskell
Universität Bielefeld
seit 1990
benannt nach dem Logiker Haskell Curry
Beeinflusst von
ML
Miranda
Programmieren
in Haskell
Sauthoff
Administratives
Programmierspr
Haskell
Quicksort
Snippets
funktional (pure)
lazy evaluation
stark typisiert
notationelles Juwel
Typinferenz
Implementierungen
Hugs
GHC
Quicksort
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
1
2
3
4
5
qsort
: : ( Ord a ) => [ a ] −> [ a ]
qsort [ ]
=
[]
q s o r t ( a : as ) =
q s o r t [ b | b <− as , b < a ]
++ [ a ]
++ q s o r t [ b | b <− as , b >= a ]
Main> qsort [1,4,2,2,4]
[1,2,2,4,4]
Programmierspr
Haskell
Quicksort
Snippets
Pseudo-Code
Universität Bielefeld
Programmieren
in Haskell
function quicksort(’array’)
Sauthoff
create empty lists ’less’ and ’greater’
Administratives
if length(’array’) <= 1
Programmierspr
// an array of zero or one elements
Haskell
// is already sorted
return ’array’
select and remove a pivot value ’pivot’ from ’array’
for each ’x’ in ’array’
if ’x’ <= ’pivot’ then append ’x’ to ’less’
else append ’x’ to ’greater’
return concatenate(quicksort(’less’), ’pivot’,
quicksort(’greater’))
Quicksort
Snippets
Quelle: http://en.wikipedia.org/w/index.php?title=
Quicksort&oldid=454693051, CC-BY-SA 3.0
Haskell-Module
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
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.
Zwischen Kommentaren und Definitionen muss sich mindestens
eine leere Zeile befinden.
Programmierspr
Haskell
Quicksort
Snippets
Beispiel
1
Universität Bielefeld
> module T e s t
2
Sauthoff
^ immer g r o s s g e s c h r i e b e n
3
4
5
Programmieren
in Haskell
Administratives
> where
Programmierspr
6
7
Es f o l g e n D e k l a r a t i o n e n und D e f i n i t i o n e n
Haskell
8
9
Snippets
f : : I n t −> I n t
10
11
^ Typnamen immer g r o s s g e s c h r i e b e n
12
13
> f x = x ∗ x
14
15
16
> l e s s : : I n t −> I n t −> Bool −− R u e c k g a b e t y p a l s l e t z t e s
> less a b = a < b
17
18
A u f r u f von d e r S h e l l v i a :
19
20
Quicksort
$ h ugs T e s t
Bedienung vom Hugs
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Aufrufen mit hugs <Modulname>
Laden eines neuen Moduls: :l <Modulname>
Programmierspr
Haskell
Quicksort
Snippets
Erneutes Laden eines Moduls nach einer Änderung: :r
Den Typ eines Ausdrucks anzeigen: :t <Ausdruck>
Alle verfügbaren Kommandos anzeigen: :?
hugs beenden: :q
Haskell-Typen
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Typ
Werte
Int
Integer
Float
Double
Bool
Char
String
Int -> Int, . . .
Ganze Zahlen
Ganze Zahlen, unbeschränkte Stelligkeit
Fliesskommazahlen 32 bit
Fliesskommazahlen 64 bit
Wahrheitswerte, True/False
Zeichen, ’a’, ’b’, . . .
Zeichenketten
Funktionen
Administratives
Programmierspr
Haskell
Quicksort
Snippets
Int vs. Integer
Universität Bielefeld
Programmieren
in Haskell
1
2
3
> fakInt
> fakInt 0
> fakInt n
:: Int -> Int
= 1
= n * fakInt (n -1)
Sauthoff
Administratives
Programmierspr
Haskell
Fak> fakInt 20
-2102132736
1
2
3
> fakInteger
:: Integer -> Integer
> fakInteger 0 = 1
> fakInteger n = n * fakInteger (n -1)
Fak> fakInteger 20
2432902008176640000
Quicksort
Snippets
Listen
Unendliche Listen:
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Hugs> [1..]
[1,2,3,4,5,6,7,8,9,10,11,
Administratives
Programmierspr
Haskell
Die ersten 4 natürlichen Zahlen:
Hugs> take 4 [1..]
[1,2,3,4]
Hugs> [1..4]
Strings sind auch Listen:
Hugs> reverse "Hello World"
"dlroW olleH"
Quicksort
Snippets
Herunterladen