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 10, 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 Warum heißen Algebraische Datentypen „algebraisch“? deriving Typ-Kontexte 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 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 append reverse take drop map filter concat Ranges siehe Tafel 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 [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 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: 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 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