Universität Bielefeld Programmieren in Haskell Sauthoff Programmieren in Haskell Administratives Programmierspr WS 2011/2012 Georg Sauthoff1 Universität Bielefeld AG Praktische Informatik October 12, 2011 1 [email protected] Haskell Kontakt Universität Bielefeld Programmieren in Haskell Sauthoff Dr. Georg Sauthoff Email: [email protected] M3-128 Programmieren in Haskell Organisation der Übungen zu A&D und Programmieren in Haskell http://www.techfak.uni-bielefeld.de/ags/pi/lehre/ AuDIWS11/ Zentrale Seite für Übungszettel, Folien, usw. Administratives Programmierspr Haskell Übungen Universität Bielefeld Programmieren in Haskell „Übungen zu Algorithmen und Datenstrukturen“sind die Übungen zu den beiden Veranstaltungen: Algorithmen & Datenstrukturen (Prof. Dr. Giegerich) Programmieren in Haskell (Dr. Georg Sauthoff) Scheinkriterien: ≥ 50 % der Punkte aktive Teilnahme an den Übungen Bearbeitung in 2er- bzw. 3er-Gruppen Anmeldung http://www.techfak.uni-bielefeld.de/ags/pi/lehre/ AuDIWS11/gruppen.pdf Sauthoff Administratives Programmierspr Haskell Prüfung Universität Bielefeld Programmieren in Haskell Sauthoff 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 Sauthoff Administratives Programmierspr Es gibt ein Vorlesungsskript zu den beiden Veranstaltungen: http://www.techfak.uni-bielefeld.de/ags/pi/lehre/ AuDIWS11/literatur_aud.html Im Laufe des Semesters werden nach Bedarf noch gedruckte Skripte zur Verfügung gestellt. Haskell Uhrzeit Universität Bielefeld Programmieren in Haskell Sauthoff Administratives Programmierspr Haskell Statt 8h c.t. ⇒ 8.30 s.t.? Nein, es bleibt bei 8h c.t. Ideengeschichte der Programmiersprachen Universität Bielefeld Programmieren in Haskell Sauthoff 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 Welche Maschinen? Konventionelle Rechnenmaschinen festverdrahtet keine Software Universität Bielefeld Programmieren in Haskell Sauthoff Administratives Programmierspr Haskell Maschinennahe Sprachen Welche Maschinen? Konventionelle Rechnenmaschinen festverdrahtet keine Software 1941: Zuse Z3 elektromechanisch (Relais!) 2 Register 200 Byte RAM programmierbar (Lochstreifen) Universität Bielefeld Programmieren in Haskell Sauthoff Administratives Programmierspr Haskell Maschinennahe Sprachen Universität Bielefeld Programmieren in Haskell Welche Maschinen? Konventionelle Rechnenmaschinen Sauthoff 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 Labels Adressen RAM Sauthoff Register Administratives Programcounter Programmierspr start: 500 add R1, R2 612 613 cmp R2, 0 cjmp start Daten R1 42 R2 13 Haskell + 42 Maschinennahe Sprachen Universität Bielefeld Programmieren in Haskell Sauthoff 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 Sauthoff Administratives Programmierspr Haskell Funktionale Programmiersprachen Universität Bielefeld Programmieren in Haskell Sauthoff 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)) Administratives Programmierspr Haskell Funktionale Programmiersprachen Universität Bielefeld Programmieren in Haskell Sauthoff 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 Administratives Programmierspr Haskell Funktionale Programmiersprachen Universität Bielefeld Programmieren in Haskell Sauthoff 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 Sauthoff 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 Sauthoff DOD-Projekt Entwicklung 1979-1983 Ziel: Aufräumen mit dem Sprachendurcheinander Universal-Sprache → Steigerung der Wiederverwendbarkeit von Software Komplexe Sprache Verbot von Sprach-Subsets ⇒ keine Verbreitung Administratives Programmierspr Haskell Gegenläufiger Trend Universität Bielefeld Programmieren in Haskell Sauthoff 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 Sauthoff 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 Sauthoff sed Administratives awk Programmierspr sh Haskell make bibtex LaTeX Postscript (Druckseitenbeschreibung) SGML, HTML (Dokumentenbeschreibung) ... 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 . . . Sauthoff Administratives Programmierspr Haskell Haskell Universität Bielefeld seit 1990 benannt nach dem Logiker Haskell Curry Beeinflusst von ML Miranda Programmieren in Haskell Sauthoff Administratives Programmierspr Haskell Quicksort Snippets funktional (pure) lazy evaluation stark typisiert notationelles Juwel Typinferenz Implementierungen Hugs GHC Quicksort Universität Bielefeld Programmieren in Haskell Sauthoff Administratives 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 ] Programmierspr Haskell Quicksort Snippets Quicksort Universität Bielefeld Programmieren in Haskell Sauthoff Administratives 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] Programmierspr Haskell Quicksort Snippets Pseudo-Code Universität Bielefeld Programmieren in Haskell function quicksort(’array’) Sauthoff 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 Sauthoff 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 Sauthoff ^ immer g r o s s g e s c h r i e b e n 3 4 5 Programmieren in Haskell Administratives > where Programmierspr 6 7 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 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 Quicksort $ h ugs T e s t Bedienung vom Hugs Universität Bielefeld Programmieren in Haskell Sauthoff Administratives Aufrufen mit hugs <Modulname> Laden eines neuen Moduls: :l <Modulname> Programmierspr Haskell Quicksort Snippets Erneutes Laden eines Moduls nach einer Änderung: :r Den Typ eines Ausdrucks anzeigen: :t <Ausdruck> Alle verfügbaren Kommandos anzeigen: :? hugs beenden: :q Haskell-Typen Universität Bielefeld Programmieren in Haskell Sauthoff 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 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) Sauthoff Administratives Programmierspr Haskell Fak> fakInt 20 -2102132736 1 2 3 > fakInteger :: Integer -> Integer > fakInteger 0 = 1 > fakInteger n = n * fakInteger (n -1) Fak> fakInteger 20 2432902008176640000 Quicksort Snippets Listen Unendliche Listen: Universität Bielefeld Programmieren in Haskell Sauthoff Hugs> [1..] [1,2,3,4,5,6,7,8,9,10,11, Administratives Programmierspr Haskell Quicksort Snippets Listen Unendliche Listen: Universität Bielefeld Programmieren in Haskell Sauthoff Hugs> [1..] [1,2,3,4,5,6,7,8,9,10,11, Administratives Programmierspr Haskell Die ersten 4 natürlichen Zahlen: Hugs> take 4 [1..] [1,2,3,4] Hugs> [1..4] Quicksort Snippets Listen Unendliche Listen: Universität Bielefeld Programmieren in Haskell Sauthoff Hugs> [1..] [1,2,3,4,5,6,7,8,9,10,11, Administratives Programmierspr Haskell Die ersten 4 natürlichen Zahlen: Hugs> take 4 [1..] [1,2,3,4] Hugs> [1..4] Strings sind auch Listen: Hugs> reverse "Hello World" "dlroW olleH" Quicksort Snippets