Eine Folie pro Seite

Werbung
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
Herunterladen