Teilt-Relation Eine Zahl teilt eine andere Zahl, wenn die Division keinen Rest ergibt. x `divides` y = y `mod` x == 0 10 Mengen { a | a in A und c teilt nicht a} In Haskell: [ a | a <- theA , not (c `divides` a)] Für theA = [2 .. 14] und c = 2 : [3,5,7,9,11,13] 11 Absolutbetrag einer Zahl abs(x) = x, falls x >= 0 -x, falls x < 0 In Haskell: abs x | x >= 0 = x abs x | x < 0 = -x 12 Primzahlen: Sieb des Eratosthenes Idee: Streiche aus der Liste aller Zahlen die Vielfachen der bereits bekannten Primzahlen heraus In Haskell: primes = sieve [2 ..] sieve (x:xs) = x : sieve [ y | y <- xs , not (x `divides` y)] Die ersten 6 Primzahlen: take 6 primes ==> [2,3,5,7,11,13] 13 Paddleball: Die Wände walls = upper `over` left `over` right where upper = paint blue (trans (0, -230) (rect 480 20)) left = paint blue (trans (-230, 0) (rect 20 440)) right = paint blue (trans (230, 0) (rect 20 440)) Drei blaue Rechtecke upper,left,right ergeben die Wände 14 Paddleball: Die Maus und das Paddle paddle = paint red (trans ((fst mouse) - 250, 220) (rect 50 10)) mouse = (fstB m, sndB m) where m = (0,0) `step` mm • mouse die momentanen Mauskoorinaten als Paar • paddle rotes Rechteck, y-Koordinate: 220, x-Kooridnate: Maus-x 250 15 Paddleball: Der Ball ball (vx, vy) = xvel xpos xbounce yvel ypos ybounce = = = = = = paint yellow (trans (round' xpos, round' ypos) (circ 20)) where vx `stepAccum` xbounce ->> negate 0+ integral xvel when (xpos >* 200 ||* xpos <* -200) vy `stepAccum` ybounce ->> negate -220+ integral yvel when (ypos <* -200 ||* ypos `between` (200, 220) &&* (lift1 fromInt (fst mouse)- 250) `between` (xpos- 25, xpos+ 25)) • Male gelben Kreis an xpos,ypos • Positionen sind das Integral der Geschwindigkeit über die Zeit • Aufprall negiert die Geschwindigkeit • Aufprall passiert, wenn Position an der Wand oder am Paddle 16 Paddleball: Das Spiel paddleball v = walls `over` paddle `over` ball v pong vel = do vx <- randomRIO (vel/2, vel) sx <- randomRIO (-1,1) reactimate "PONG" (paddleball (signum sx * vx, - abs vel)) • Wände, Paddle und Ball übereinander • Anfangsgeschwindigkeit ist zufällig 17 Hauptmerkmale Funktionaler Programmierung • Funktionen sind Werte erster Klasse ("higher-order Funktionen") Z.B. Clean, Scheme, ML, Haskell, JavaScript Rein-funktionale Programmiersprachen zusätzlich: • Keine Seiteneffekte (Zuweisung, Mutation) • Nichtstrikte Auswertung Z.B. Clean, Haskell, Hope, Gopher Hier: Funktionale Programmierung = rein-funktionale Programmierung 18 Vorteile für das Programmieren im Großen • Higer-order Funktionen ermöglichen Wiederverwendung von Funktionsteilen • Abwesenheit von Seiteneffekten erleichtert das Nachdenken über Funktionen und Programme • Nichtstrikte Auswertung ermöglicht unendlich große Datenstrukturen 19 Weitere Merkmale • Mächtiges Typsystem mit Polymorphie, Inferenz, Überladung • Definition eigener Kontrollstrukturen • Präzise Syntax • Automatische Speicherverwaltung Zusammengefasst: Deklaratives Programmieren 20 Warum Funktionale Programmierung? (1/2) Fakt: FP wird in der Wirtschaft selten verwendet Warum dann diese Vorlesung hören? • Etwas anderes sehen. • Neue Konzepte kennen lernen 21 Warum Funktionale Programmierung? (2/2) • Einige Konzepte sind schon im Mainstream: GC seit Java HO-Funktionen in Ruby, Python, JavaScript for-each-Konstrukte in Script-Sprachen Polymorphie als Templates in C++ und als Generics in Java In der FP kann man sie in Reinform sehen und verstehen. • FP verschafft Einblicke in das Wesen von Programmiersprachen 22 Stoff dieser Vorlesung (1/2) • Funktionsdefinitionen, gleichungsbasiertes Auswerten • Basistypen, Layout-Syntax • Design von Haskell-Programmen • Tupel und Listen, List-Comprehension, Polymorphie, Strings • Lokale Definitionen • Listenfunktionen: designen und beweisen 23 Stoff dieser Vorlesung (2/2) • Funktionen als Werte • Überladung mit Typklassen • Algeraische Datentypen • Modulsystem und abstrakte Datentypen • Lazy-Programming • Programmieren mit Aktionen, Robotersteuerung • Funktional-reaktive Programmierung 24