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