Schleifen 1 Funktionale Programmierung Jörg Kreiker Uni Kassel und SMA Solar Technology AG Wintersemester 2011/2012 2 Teil I Jedem Anfang wohnt ein Zauber inne 3 Über mich • Diplom in Informatik in Saarbrücken 2001 • Promotion in Informatik in Saarbrücken 2006 • Habilitation in Informatik an der TU München 2011 • Heute • Systemarchitekt bei SMA Solar Technology • Lehrbeauftrageter und PD an der Uni Kassel am LS Formale Methoden und Softwareverifikation (Lange) • joerg.kreiker@{sma.de, uni-kassel.de} 4 Ort und Zeit • Vorlesung: montags, 16-18 Uhr, Hörsaal 0446 • Vortrag • Interaktion • Live Programmierung • Übung: montags, 18-20 Uhr, Raum, Raum 1201 • Wildes Programmieren • Online Aufgaben • Übungsblätter • Pausen nach Bedarf 5 Prüfung 1. Praxis: Projekte • Interpreter (10 Punkte) • Schach (10 Punkte) 2. Theorie: 20 Punkte, mündliche oder schriftliche Prüfung nach Bedarf 6 Noten Σ Punkte [0, 5) [5, 11) [11, 17) [17, 19] (19, 22] (22, 24] (24, 26] (26, 28] (28, 30] (30, 32] (32, 34] (34, 36] (36, 40] Note 5,0 4,7 4,3 4,0 3,7 3,3 3,0 2,7 2,3 2,0 1,7 1,3 1,0 7 Material • Webseiten • haskell.org • realworldhaskell.org mit gratis Onlinebuch • Noch ein Buch: http://www.cs.brown.edu/ sk/Publications/Books/ProgLangs • Artikel, leicht findbar im Web • J. Hudak, J. Peterson, J.H. Fasel. A Gentle Introduction to Haskell 98. • Simon Peyton Jones. Haskell: The Revised Report. • Philip Wadler. Monads for functional programming. • S.P. Jones, A. Gordon, S. Finne. Concurrent Haskell. • History of Haskell • Slides, Beispielprogramme, Beispiellösungen auf Kurswebseite: http://cms.uni-kassel.de/unicms/index.php?id=38132 8 Interpreter und Compiler • GHC runterladen von haskell.org • Entwicklungsumgebung nach Wahl • Im Rechnerpool installiert 9 Merkwürdiges 1. Interaktion: unterbrecht mich, fragt, antwortet 2. Summabstimmung 3. Klassenfahrt zu SMA im Februar 4. Feedback 10 STOP 11 Abstimmung • Wer hat schon funktional programmiert? • Lieblingssprache? • Implementiert • Startwitz • Fakultätsfunktion in Eurer Lieblingssprache! Haskell 13 Haskell • pure • funktional • lazy 14 Deklarative vs. imperative Programmierung Deklarativ Was? Imperativ Wie? 15 Coole Features • Viele Konstrukte aus funktionalen Sprachen im Mainstream • λ Ausrücke (C#) • Closures (Java, PHP, Lua, . . . ) • map/reduce (Datenbanken) • Pattern Matching (Scala) • Polymorphismus (Generics) • Funktionen höherer Ordnung 16 Coole Projekte • http://www.haskell.org/haskellwiki/Haskell in industry • detexify • Google: interne Werkzeuge • Facebook: lex-pass, Werkzeug zur PHP Code Manipulation • Andere Firmen: Amgen, ABN Amro, Deutsche Bank, . . . 17 Inhalte • Abstrakte Datentypen • Variablen vs. Bezeichner • Polymorphismus • Typinferenz • Monaden • Call Strategien (by-{value, name, reference, need}) • Zustände • Laziness • Software Transactional Memory 18 Lernziele • Fähigkeit Vorgennantes schnell zu erlernen • Konzepte, Tricks, Ideen aus funktionaler Programmierung kennenlernen und adaptieren • Geeignete Programmiersprachen identifizieren • Grundlagen von Programmiersprachen • Anpassungsfähigkeit: Sprachdefinition lesen, verstehen, erstellen 19 Keine Lernziele • Haskell Hacker • GUIs • Netzwerkprogrammierung • Spieleprogrammierung • ... 20 STOP 21 Ausrücke, Werte, Typen • Im Interpreter schreiben wir Ausdrücke • Ausdruck wird ausgewertet zu einem Wert • Jeder Ausdruck und jeder Wert haben einen Typ • Beispiel 1 True ’a’ 1+2 1/0 1.0/2.5 =⇒ 1 :: Integer =⇒ True :: Bool =⇒ 0 a 0 :: Char =⇒ 3 :: Integer =⇒ ? :: Integer =⇒ 0.4 :: Float Strukturierte Werte und Typen • Tupel: • 0 oder ≥ 2 Elemente • Nicht notwendigerweise gleichen Typs () =⇒ () :: () (’a’,True) =⇒ (0 a 0 , True ) :: (Char , Bool ) • Listen: • ≥ 0 Elemente • Alle Elemente selber Typ [1+1,2,3] =⇒ [2, 2, 3] [] =⇒ [] [[],[2]] =⇒ [[], [2]] (1==2) : (2==2) : [] =⇒ [False , True ] [1,2] ++ [1,2] =⇒ [1, 2, 1, 2] :: :: :: :: :: [Integer ] [a ] [[Integer ]] [Bool ] [Integer ] 23 Bedingte Ausdrücke • if-then-else Ausdrücke • if x==1 then 2 else 3 :: Integer • (if x==1 then 2 else 3) + (if x==0 then 4 else 5) 24 Funktionen • Funktionen sind Werte \x -> x + 1 \(x,y) -> x + y :: Integer → Integer :: (Integer , Integer ) → Integer • Funktionen können Funktionen als Resultat haben: Kaskadierung \x y -> x + y :: Integer → Integer → Integer • Funktionen können Argumente sein: Funktionen höherer Ordnung \f x y -> f (x,y) \f g x -> f (g x) :: ((α, β) → γ) → α → β → γ :: (α → β) → (γ → α) → γ → β 25 Rekursion • Rekursive Funktionen durch Funktionsdefinition deklariert • Verschiedene Fälle mittels Muster mult 0 n = 0 mult k n = n + mult (k-1) n • Verschränkte Rekursion e = \k -> o = \k -> if k==0 else if if k==0 else if then k==1 then k==1 True then False else o (k-1) True then False else e (k-1) 26 Beispiel f 1 = 1 f 2 = 1 f n = f (n-1) + f (n-2) Fibonacci 27 Beispiel m f [] = [] m f (x:xs) = f x : m f xs Map 28 STOP 29