Programmieren in Haskell - WS 2011/2012

Werbung
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Programmieren in Haskell
Administratives
Musik
WS 2011/2012
Algebraic
Datatypes
Listen
Georg Sauthoff1
Ranges
List Comprehensions
Universität Bielefeld
AG Praktische Informatik
Sortieren
Primzahlen
November 1, 2011
1
[email protected]
Übungen
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Abgaben und Aufgabenblätter am Ende der Vorlesung
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Skript
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
gibt es demnächst in den Übungen
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Musik
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Der Nachfolger von Haskore ist Euterpea:
http://haskell.cs.yale.edu/?page_id=103
Paul Hudak. The Haskell School of Music. 2.0 edition,
2011.
http:
//www.cs.yale.edu/homes/hudak/Papers/HSoM.pdf
Musik
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Algebraic Datatypes
Universität Bielefeld
Programmieren
in Haskell
Allgemeine Form der Deklaration:
data T a1 . . . am = C1 t11 . . . t1n1
...
Cr tr 1 . . . trnr
|
|
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Listen
T Typkonstruktor
Ranges
Ci (Daten-)Konstruktoren
List Comprehensions
ai Typvariablen
Sortieren
tij Typen oder Typvariablen
Primzahlen
Algebraic Datatypes
Universität Bielefeld
Programmieren
in Haskell
Allgemeine Form der Deklaration:
data T a1 . . . am = C1 t11 . . . t1n1
...
|
|
Cr tr 1 . . . trnr
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Listen
T Typkonstruktor
Ranges
Ci (Daten-)Konstruktoren
List Comprehensions
ai Typvariablen
Sortieren
tij Typen oder Typvariablen
Primzahlen
Warum heißen Algebraische Datentypen „algebraisch“?
Algebraic Datatypes
Universität Bielefeld
Programmieren
in Haskell
Allgemeine Form der Deklaration:
data T a1 . . . am = C1 t11 . . . t1n1
...
|
|
Cr tr 1 . . . trnr
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Listen
T Typkonstruktor
Ranges
Ci (Daten-)Konstruktoren
List Comprehensions
ai Typvariablen
Sortieren
tij Typen oder Typvariablen
Primzahlen
Warum heißen Algebraische Datentypen „algebraisch“?
deriving
Typ-Kontexte
Beispiel: Listen
Example
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
[1..5] = [1,2,3,4,5] = 1:2:3:4:5:[]
Administratives
Musik
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Beispiel: Listen
Universität Bielefeld
Programmieren
in Haskell
Example
Sauthoff
[1..5] = [1,2,3,4,5] = 1:2:3:4:5:[]
Cons
Administratives
Musik
Algebraic
Datatypes
1
Cons
Listen
Ranges
2
List Comprehensions
Cons
Sortieren
3
Cons
4 Cons
5 Nil
Primzahlen
Beispiel: Listen
Universität Bielefeld
Programmieren
in Haskell
Example
Sauthoff
[1..5] = [1,2,3,4,5] = 1:2:3:4:5:[]
Administratives
:
Cons
Musik
Algebraic
Datatypes
1
1
Cons
:
Listen
Ranges
2
2
Cons
:
List Comprehensions
Sortieren
3
Cons
4 Cons
5 Nil
3
:
4
Primzahlen
:
5 []
Listendefinition
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
1
2
data List a =
Cons a ( List a ) |
Nil
Musik
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Listendefinition
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
1
data List a =
2
Cons a ( List a ) |
Nil
Musik
Algebraic
Datatypes
Listen
Pseudo-Code
1
2
data [ a ] = a : [ a ] |
[]
Ranges
List Comprehensions
Sortieren
Primzahlen
Elementare Funktionen auf Listen
Universität Bielefeld
Programmieren
in Haskell
head
Sauthoff
tail
length
Administratives
Musik
sum
Algebraic
Datatypes
product
Listen
enumFromTo
apppend
reverse
take
drop
map
filter
concat
Ranges
siehe Tafel
List Comprehensions
Sortieren
Primzahlen
Arithmetic Sequences
Syntaktischer Zucker für Listen
[expr1..]
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Arithmetic Sequences
Syntaktischer Zucker für Listen
[expr1..]
[expr1..expr2]
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Arithmetic Sequences
Syntaktischer Zucker für Listen
[expr1..]
[expr1..expr2]
[expr1,expr2..]
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Arithmetic Sequences
Syntaktischer Zucker für Listen
[expr1..]
[expr1..expr2]
[expr1,expr2..]
[expr1,expr2..expr3]
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Arithmetic Sequences
Syntaktischer Zucker für Listen
[expr1..]
[expr1..expr2]
[expr1,expr2..]
[expr1,expr2..expr3]
Example
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Listen
Ranges
Hugs> [1..5]
[1,2,3,4,5]
Hugs> [1,3..10]
[1,3,5,7,9]
Hugs> [2,4..10]
[2,4,6,8,10]
Hugs> [1..]
[1,2,3,...
List Comprehensions
Sortieren
Primzahlen
Arithmetic Sequences
Universität Bielefeld
Programmieren
in Haskell
Übersetzung:
[expr1..] = enumFrom expr1
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Arithmetic Sequences
Universität Bielefeld
Programmieren
in Haskell
Übersetzung:
[expr1..] = enumFrom expr1
Sauthoff
Administratives
Musik
[expr1..expr2] = enumFromTo expr1 expr2
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Arithmetic Sequences
Universität Bielefeld
Programmieren
in Haskell
Übersetzung:
[expr1..] = enumFrom expr1
Sauthoff
Administratives
Musik
[expr1..expr2] = enumFromTo expr1 expr2
[expr1,expr2..] = enumFromThen expr1 expr2
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Arithmetic Sequences
Universität Bielefeld
Programmieren
in Haskell
Übersetzung:
[expr1..] = enumFrom expr1
Sauthoff
Administratives
Musik
[expr1..expr2] = enumFromTo expr1 expr2
[expr1,expr2..] = enumFromThen expr1 expr2
Algebraic
Datatypes
Listen
Ranges
[expr1,expr2..expr3] = enumFromThenTo expr1 expr2 List
expr3
Comprehensions
Sortieren
Primzahlen
Arithmetic Sequences
Universität Bielefeld
Programmieren
in Haskell
Übersetzung:
[expr1..] = enumFrom expr1
Sauthoff
Administratives
Musik
[expr1..expr2] = enumFromTo expr1 expr2
[expr1,expr2..] = enumFromThen expr1 expr2
Algebraic
Datatypes
Listen
Ranges
[expr1,expr2..expr3] = enumFromThenTo expr1 expr2 List
expr3
Comprehensions
Voraussetzung:
expri haben den Gleichen Typ T
Typ T gehört der Typklasse Enum an
Sortieren
Primzahlen
Arithmetic Sequences
Universität Bielefeld
Programmieren
in Haskell
Übersetzung:
[expr1..] = enumFrom expr1
Sauthoff
Administratives
Musik
[expr1..expr2] = enumFromTo expr1 expr2
[expr1,expr2..] = enumFromThen expr1 expr2
Algebraic
Datatypes
Listen
Ranges
[expr1,expr2..expr3] = enumFromThenTo expr1 expr2 List
expr3
Comprehensions
Voraussetzung:
expri haben den Gleichen Typ T
Typ T gehört der Typklasse Enum an
→ Enumsemantik ist datentypabhängig
Sortieren
Primzahlen
List Comprehensions
(Übersetzt auch: Listenbeschreibung)
List Comprehension
1
[ expr | qual1 , ... , qualn ]
(wobei n >= 1)
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
List Comprehensions
(Übersetzt auch: Listenbeschreibung)
List Comprehension
1
[ expr | qual1 , ... , qualn ]
(wobei n >= 1)
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Qualifier ist:
Generator: pat <- expr
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
List Comprehensions
(Übersetzt auch: Listenbeschreibung)
List Comprehension
1
[ expr | qual1 , ... , qualn ]
(wobei n >= 1)
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Qualifier ist:
Generator: pat <- expr
Guard (oder Filter): boolexpr
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
List Comprehensions
(Übersetzt auch: Listenbeschreibung)
List Comprehension
1
[ expr | qual1 , ... , qualn ]
(wobei n >= 1)
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Qualifier ist:
Generator: pat <- expr
Guard (oder Filter): boolexpr
lokale Deklaration: let decls
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
List Comprehensions
(Übersetzt auch: Listenbeschreibung)
List Comprehension
1
[ expr | qual1 , ... , qualn ]
(wobei n >= 1)
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Qualifier ist:
Generator: pat <- expr
Guard (oder Filter): boolexpr
lokale Deklaration: let decls
Example
1
[ x * x | x <- [1..20] , odd x ]
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
List Comprehensions
(Übersetzt auch: Listenbeschreibung)
List Comprehension
1
[ expr | qual1 , ... , qualn ]
(wobei n >= 1)
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Qualifier ist:
Generator: pat <- expr
Guard (oder Filter): boolexpr
lokale Deklaration: let decls
Example
1
[ x * x | x <- [1..20] , odd x ]
[1,9,25,49,81,121,169,225,289,361]
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Listen Comprehensions
Universität Bielefeld
Programmieren
in Haskell
Übersetzungsschema:
[ expr | True ] = [ expr ]
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Listen Comprehensions
Universität Bielefeld
Programmieren
in Haskell
Übersetzungsschema:
Sauthoff
[ expr | True ] = [ expr ]
Administratives
[ expr | qual, True ] = [ expr | qual ]
Musik
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Listen Comprehensions
Universität Bielefeld
Programmieren
in Haskell
Übersetzungsschema:
Sauthoff
[ expr | True ] = [ expr ]
Administratives
[ expr | qual, True ] = [ expr | qual ]
Musik
[ expr | guard, qual1, ..., qualn ] =
if guard then [ e | qual1 , ... , qualn ]
else []
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Listen Comprehensions
Universität Bielefeld
Programmieren
in Haskell
Übersetzungsschema:
Sauthoff
[ expr | True ] = [ expr ]
Administratives
[ expr | qual, True ] = [ expr | qual ]
Musik
[ expr | guard, qual1, ..., qualn ] =
if guard then [ e | qual1 , ... , qualn ]
else []
Algebraic
Datatypes
[ expr | pat <- list, qual1, ..., qualn] =
let f pat = [ expr | qual1 , ... , qualn ]
f _
= []
in concatMap f list
List Comprehensions
Listen
Ranges
Sortieren
Primzahlen
Listen Comprehensions
Universität Bielefeld
Programmieren
in Haskell
Übersetzungsschema:
Sauthoff
[ expr | True ] = [ expr ]
Administratives
[ expr | qual, True ] = [ expr | qual ]
Musik
[ expr | guard, qual1, ..., qualn ] =
if guard then [ e | qual1 , ... , qualn ]
else []
Algebraic
Datatypes
[ expr | pat <- list, qual1, ..., qualn] =
let f pat = [ expr | qual1 , ... , qualn ]
f _
= []
in concatMap f list
List Comprehensions
[ expr | let decls, qual1, ..., qualn ] =
let decls in [ expr | qual1 , ... , qualn ]
Listen
Ranges
Sortieren
Primzahlen
Sortieren
Universität Bielefeld
Programmieren
in Haskell
Spezifikation des Sortierproblems:
genauer: Sortieren per Vergleich
Sauthoff
Administratives
Musik
Eingabe: Liste l
Elemente vom Typ T
Algebraic
Datatypes
Listen
T ist eine Instanz der Typklasse Ord
Ausgabe: sortierte Liste r
Ranges
List Comprehensions
Sortieren
Insertion Sort
Quicksort
Primzahlen
Sortieren
Universität Bielefeld
Programmieren
in Haskell
Spezifikation des Sortierproblems:
genauer: Sortieren per Vergleich
Sauthoff
Administratives
Musik
Eingabe: Liste l
Elemente vom Typ T
Algebraic
Datatypes
Listen
T ist eine Instanz der Typklasse Ord
Ausgabe: sortierte Liste r
length l = length r
für alle x ∈ l: length [ a | a <- l, a == x]
= length [ b | b <- r, b == x]
is_ordered l
Ranges
List Comprehensions
Sortieren
Insertion Sort
Quicksort
Primzahlen
Insertion Sort
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
siehe Tafel
Listen
Ranges
List Comprehensions
Sortieren
Insertion Sort
Quicksort
Primzahlen
Quicksort
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
siehe Tafel
Listen
Ranges
List Comprehensions
Sortieren
Insertion Sort
Quicksort
Primzahlen
Primzahlen
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Primzahl
natürliche Zahl > 1
nur teilbar durch 1 und sich selbst
Algebraic
Datatypes
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Sieb des
Eratosthenes
Sieb des Eratosthenes
Universität Bielefeld
Programmieren
in Haskell
Sauthoff
Administratives
Musik
Algebraic
Datatypes
Siehe Tafel
Listen
Ranges
List Comprehensions
Sortieren
Primzahlen
Sieb des
Eratosthenes
Herunterladen