Programmieren in Haskell

Werbung
Programmieren
in Haskell
Stefan
Janssen
Programmieren in Haskell
Programmierung
Stefan Janssen
Universität Bielefeld
AG Praktische Informatik
November 19, 2014
Primzahlen
Sortieren
Auf geht’s!
Programmieren
in Haskell
Stefan
Janssen
Primzahlen
Wir wollen endlich mal etwas Nützliches programmieren mit
dem, was wir bisher von Haskell kennen.
Primzahlen
Sortieren
Sortieren
Primzahlen
Programmieren
in Haskell
Stefan
Janssen
Primzahl
natürliche Zahl > 1
nur teilbar durch 1 und sich selbst
Erster Versuch: Hier ist direkt die Definition progammiert:
1
2
3
4
5
> primesSlow
> primesSlow
>
where
>
divisors
>
divisors
: : I n t e g r a l a => [ a ]
= [ n | n <− [ 2 . . ] , d i v i s o r s n == [ 1 , n ] ]
: : I n t e g r a l a => a −> [ a ]
n = [ d | d <− [ 1 . . n ] , n ‘mod ‘ d == 0 ]
Primzahlen
Sieb des
Eratosthenes
Sortieren
Sieb des Eratosthenes
Programmieren
in Haskell
Aus der Liste aller Zahlen werden sukzessive die Vielfachen der
bereits gefundenen Primzahlen herausgesiebt ...
Stefan
Janssen
Primzahlen
Sieb des
Eratosthenes
Sortieren
1
2
> primes :: Integral a = > [ a ]
> primes = sieve [2..] where
3
4
5
>
>
sieve :: Integral a = > [ a ] -> [ a ]
sieve ( a : xs ) = a : sieve [ n |n < - xs , n ‘ mod ‘ a /= 0]
Darüber muss man eine Weile nachdenken!
Sortieren
Programmieren
in Haskell
Spezifikation des Sortierproblems:
Stefan
Janssen
genauer: Sortieren per Vergleich
Primzahlen
Eingabe: Liste l
Sortieren
Insertion Sort
Elemente vom Typ T
T ist eine Instanz der Typklasse Ord
Ausgabe: sortierte Liste r
Quicksort
Sortieren
Programmieren
in Haskell
Spezifikation des Sortierproblems:
Stefan
Janssen
genauer: Sortieren per Vergleich
Primzahlen
Eingabe: Liste l
Sortieren
Insertion Sort
Elemente vom Typ T
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
Quicksort
Insertion Sort
Programmieren
in Haskell
Stefan
Janssen
1
2
3
> isort :: Ord a = > [ a ] -> [ a ]
> isort [] = []
> isort ( x : xs ) = insert x ( isort xs ) where
4
5
6
7
8
>
>
>
>
insert x
insert x
| x <=
| x >
[] = [ x ]
( y : ys )
y = x : y : ys
y = y :( insert x ys )
Primzahlen
Sortieren
Insertion Sort
Quicksort
Quicksort
Programmieren
in Haskell
Stefan
Janssen
Quicksort – noch bekannt aus der ersten Vorlesung ...?
Primzahlen
Sortieren
Insertion Sort
Quicksort
1
2
3
4
5
> qsort :: Ord a = > [ a ] -> [ a ]
> qsort []
= []
> qsort ( a : xs ) = qsort [ b | b <- xs , b < a ] ++
>
[ a ] ++
>
qsort [ b | b <- xs , b >= a ]
Zum Ende noch ein Rätsel
69
Unsere Programm enthält die Definition
> xx = round 4.5
Wie berechnen xx zweimal und betrachten die Rechenschritte:
1
2
3
4
5
8
9
Stefan
Janssen
Primzahlen
Sortieren
Arr > : s + s
Arr > xx
4
(425 reductions , 844 cells )
6
7
Programmieren
in Haskell
Arr > xx
4
(20 reductions , 30 cells )
Wieso ist die zweite Berechnung schneller?
Was ist überhaupt eine “Reduktion”?
Insertion Sort
Quicksort
Herunterladen