Programmieren in Haskell - WS 2012/2013

Werbung
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Programmieren in Haskell
WS 2012/2013
Robert Giegerich
Universität Bielefeld
AG Praktische Informatik
October 9, 2012
Administratives
Programmierspr
Haskell
Kontakt & Kontext
Prof. Dr. Robert Giegerich
Email: [email protected]
M3-125
Veranstaltungen im Modul A&D:
Programmieren in Haskell
Algorithmen und Datenstrukturen (Dr. Thiess Pfeiffer)
Übungen zu A&D und Programmieren in Haskell
(Stefan Janssen + 12 Tutoren)
UNIX Einführung (Dr. Carsten Gnörlich + Tutoren)
http://www.techfak.uni-bielefeld.de/ags/pi/lehre/
AuDIWS12/
Zentrale Seite für Übungszettel, Folien, usw.
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Programmierspr
Haskell
Übungen
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
„Übungen zu Algorithmen und Datenstrukturen“ sind
gemeinsame Übungen zu den beiden Veranstaltungen:
Algorithmen & Datenstrukturen
Programmieren in Haskell
Scheinkriterien:
≥ 50 % der Punkte
aktive Teilnahme an den Übungen
Bearbeitung in 2er- bzw. 3er-Gruppen
Programmierspr
Haskell
Prüfung
Universität Bielefeld
Programmieren
in Haskell
Giegerich
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
Giegerich
Administratives
Programmierspr
Haskell
Es gibt ein Vorlesungsskript zu den beiden Veranstaltungen:
http://www.techfak.uni-bielefeld.de/ags/pi/lehre/
AuDIWS11/literatur_aud.html
Uhrzeit
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Programmierspr
Haskell
Mittwochs, 16 c.t. - 18 Uhr
... in der Mitte ca 10 Min Pause ...
Ideengeschichte der Programmiersprachen
Universität Bielefeld
Programmieren
in Haskell
Giegerich
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
Giegerich
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
Giegerich
Administratives
Programmierspr
Haskell
Vgl.auch:
Unbeschränkte Registermaschine, A&D-Vorlesung
Maschinennahe Sprachen
Universität Bielefeld
Programmieren
in Haskell
Giegerich
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
Giegerich
Administratives
Programmierspr
Haskell
Funktionale Programmiersprachen
Universität Bielefeld
Programmieren
in Haskell
Giegerich
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
Giegerich
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
Giegerich
DOD-Projekt
Administratives
Entwicklung 1979-1983
Programmierspr
Haskell
Ziel: Aufräumen mit dem Sprachendurcheinander
Universal-Sprache
→ Steigerung der Wiederverwendbarkeit von Software
Komplexe Sprache
Verbot von Sprach-Subsets
⇒ keine Verbreitung
Gegenläufiger Trend
Universität Bielefeld
Programmieren
in Haskell
Giegerich
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
Giegerich
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
sed
awk
sh
make
bibtex
LaTeX
Postscript (Druckseitenbeschreibung)
SGML, HTML (Dokumentenbeschreibung)
...
aus Bielefeld: Locomotif, Bellman’s GAP (Bioinformatik)
Giegerich
Administratives
Programmierspr
Haskell
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 . . .
Giegerich
Administratives
Programmierspr
Haskell
Haskell
Universität Bielefeld
seit 1990
benannt nach dem Logiker Haskell Curry
Beeinflusst von
ML
Miranda
Programmieren
in Haskell
Giegerich
Administratives
Programmierspr
Haskell
Quicksort
Snippets
funktional (pure)
lazy evaluation
stark typisiert
notationelles Juwel
Typinferenz
Implementierungen
Hugs
GHC
Quicksort
Universität Bielefeld
Programmieren
in Haskell
Giegerich
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]
Administratives
Programmierspr
Haskell
Quicksort
Snippets
Pseudo-Code
Universität Bielefeld
Programmieren
in Haskell
function quicksort(’array’)
Giegerich
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
Giegerich
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
4
Administratives
> where
Programmierspr
6
7
Giegerich
^ immer g r o s s g e s c h r i e b e n
3
5
Programmieren
in Haskell
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
Quicksort
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
$ h ugs T e s t
Bedienung vom Hugs
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Administratives
Aufrufen mit hugs <Modulname>
Programmierspr
Laden eines neuen Moduls: :l <Modulname>
Haskell
Erneutes Laden eines Moduls nach einer Änderung: :r
Den Typ eines Ausdrucks anzeigen: :t <Ausdruck>
Alle verfügbaren Kommandos anzeigen: :?
hugs beenden: :q
Quicksort
Snippets
Haskell-Typen
Universität Bielefeld
Programmieren
in Haskell
Giegerich
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, “abrakadabra”
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)
Fak> fakInt 20
-2102132736
1
2
3
> fakInteger
:: Integer -> Integer
> fakInteger 0 = 1
> fakInteger n = n * fakInteger (n -1)
Fak> fakInteger 20
2432902008176640000
Giegerich
Administratives
Programmierspr
Haskell
Quicksort
Snippets
Listen
Unendliche Listen:
Universität Bielefeld
Programmieren
in Haskell
Giegerich
Hugs> [1..]
[1,2,3,4,5,6,7,8,9,10,11,^C
Die ersten 4 natürlichen Zahlen:
Administratives
Programmierspr
Haskell
Quicksort
Snippets
Hugs> take 4 [1..]
[1,2,3,4]
Hugs> [1..4]++[4,3..1]
[1,2,3,4,4,3,2,1]
Strings sind auch Listen:
Hugs> reverse "Hello World"
"dlroW olleH"
Herunterladen