• Keine Ergebnisse gefunden

Reaktive Programmierung

N/A
N/A
Protected

Academic year: 2022

Aktie "Reaktive Programmierung"

Copied!
2
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Reaktive Programmierung

Vorlesung 12 vom 07.06.17: Funktional-Reaktive Programmierung

Christoph Lüth, Martin Ring Universität Bremen Sommersemester 2017

16:21:40 2017-06-07 1 [14]

Fahrplan

I Einführung

I Monaden als Berechnungsmuster I Nebenläufigkeit: Futures and Promises I Aktoren I: Grundlagen

I Aktoren II: Implementation I Bidirektionale Programmierung I Meta-Programmierung I Reaktive Ströme I I Reaktive Ströme II

I Functional Reactive Programming I Software Transactional Memory I Eventual Consistency I Robustheit und Entwurfsmuster I Theorie der Nebenläufigkeit, Abschluss

RP SS 2017 2 [14]

Das Tagemenü

I Funktional-Reaktive Programmierung(FRP) istreinfunktionale, reaktive Programmierung.

I SehrabstraktesKonzept — im Gegensatz zu Observables und Aktoren.

I Literatur: Paul Hudak,The Haskell School of Expression, Cambridge University Press 2000, Kapitel 13, 15, 17.

I Andere (effizientere) Implementierung existieren.

RP SS 2017 3 [14]

FRP in a Nutshell

Zwei Basiskonzepte:

I Kontinuierliches, über der Zeit veränderlichesVerhalten:

typeTime = Float

type Behaviour a = Time→ a

Time a

I Beispiel: Position eines Objektes

IDiskrete Ereignissezu einem bestimmten Zeitpunkt:

type Event a = [ (Time, a) ]

Time a

IBeispiel: Benutzereingabe Obige Typdefinitionen sindSpezifikation, nichtImplementation

RP SS 2017 4 [14]

Verhalten: erste einfache Beispiele

I Ein kreisender und ein pulsierender Ball:

ci rc , pulse :: Behavior Region

c i r c = t r a n s l a t e ( cos time , s i n time) ( e l l 0.2 0.2) pulse = e l l ( cos time∗ 0.5) ( cos time∗ 0.5)

I Was passiert hier?

I Basisverhalten:time :: Behaviour Time,constB :: a→Behavior a

I Grafikbücherei: DatentypRegion, Funktion Ellipse

I Liftings (∗,0.5,sin, . . . )

RP SS 2017 5 [14]

Lifting

I Um einfach mitBehaviourumgehen zu können, werden Funktionen zu Behaviourgeliftet:

($∗) :: Behavior (a→b) → Behavior a → Behavior b l i f t 1 :: (a→ b) → ( Behavior a→ Behavior b)

IGleiches mit lift2, lift3,. . .

I Damit komplexere Liftings (für viele andere Typklassen):

instanceNum a =>Num ( Behavior a) where (+) = l i f t 2 (+)

instance Floating a =>Floating ( Behavior a) where s i n = l i f t 1 s i n

RP SS 2017 6 [14]

Reaktive Animationen: Verhaltensänderung

I Beispiel: auf Knopfdruck Farbe ändern:

color1 :: Behavior Color color1 = red ‘ untilB ‘ lbp−blue

color2 = red ‘ untilB ‘ ( lbp−blue .|. key−yellow ) I Was passiert hier?

I untilBkombiniert Verhalten:

untilB :: Behavior a→Event ( Behavior a) → Behavior a

I =>>istmapfür Ereignisse:

(=>>) :: Event a→ (a→b)→Event b

(−) :: Event a→b→Event b

I Kombination von Ereignissen:

( .|. ) :: Event a→Event a→Event a

RP SS 2017 7 [14]

Der Springende Ball

ball2 = paint red ( t r a n s l a t e (x , y) ( e l l 0.2 0.2) )where g = −4

x = −3 + i n t e g r a l 0.5 y = 1.5 + i n t e g r a l vy vy = i n t e g r a l g ‘ switch ‘

( hity ‘ snapshot_ ‘ vy =>> λv ’→ l i f t 0 (−v ’ ) + i n t e g r a l g) hity = when (y<∗ −1.5)

ball2x = paint red ( t r a n s l a t e (x , y) ( e l l 0.2 0.2) )where g = −4

x = −3 + i n t e g r a l vx vx = 0.5 ‘ switch ‘ ( hitx−−vx) hitx = when (x<∗ −3 | | ∗x>∗3) y = 1.5 + i n t e g r a l vy vy = i n t e g r a l g ‘ switch ‘

( hity ‘ snapshot_ ‘ vy =>> λv ’→ l i f t 0 (−v ’ ) + i n t e g r a l g) hity = when (y<∗ −1.5)

I Nützliche Funktionen:

i n t e g r a l :: Behavior Float→Behavior Float snapshot :: Event a→Behavior b→Event (a , b) Event fe ‘ snapshot ‘ Behavior fb

I Erweiterung: Ball ändert Richtung, wenn er gegen die Wand prallt.

RP SS 2017 8 [14]

(2)

Implementation

I Verhalten, erste Annäherung:

dataBeh1 a = Beh1 ( [ ( UserAction , Time) ]→Time→a) I Problem:SpeicherleckundIneffizienz

I Analogie: suche insortiertenListen i n L i s t :: [ Int ] → Int → Bool i n L i s t xs y = elem y xs

manyInList ’ :: [ Int ]→ [ Int ]→ [ Bool ] manyInList ’ xs ys = map ( i n L i s t xs ) ys I Besser Sortiertheit direkt nutzen

manyInList :: [ Int ] → [ Int ] → [ Bool ]

RP SS 2017 9 [14]

Implementation

I Verhalten werdeninkrementell abgetastet:

dataBeh2 a

= Beh2 ( [ ( UserAction ,Time) ] → [Time] → [ a ] ) I Verbesserungen:

IZeit doppelt, nureinmal

IAbtastung auchohne Benutzeraktion

ICurrying dataBehavior a

= Behavior ( ( [Maybe UserAction ] , [ Time] ) → [ a ] ) I Ereignisse sind im Prinzipoptionales Verhalten:

dataEvent a = Event ( Behaviour (Maybe a) )

RP SS 2017 10 [14]

Längeres Beispiel: Pong!

I Pong besteht aus Paddel, Mauern und einem Ball.

I Das Paddel:

paddle = paint red ( t r a n s l a t e ( f s t mouse,−1.7) ( rec 0.5 0.05) )

I Die Mauern:

walls :: Behavior Picture I . . . und alles zusammen:

paddleball v e l = walls ‘ over ‘ paddle ‘ over ‘ pball v e l

RP SS 2017 11 [14]

Pong: der Ball

I Der Ball:

pball v e l =

let xvel = v e l ‘stepAccum ‘ xbounce−negate xpos = i n t e g r a l xvel

xbounce = when (xpos>∗ 2 | | ∗xpos<∗ −2) yvel = v e l ‘stepAccum ‘ ybounce−negate ypos = i n t e g r a l yvel

ybounce = when (ypos>∗1.5

| | ∗ypos ‘between ‘ (−2.0,−1.5) &&∗

f s t mouse ‘between ‘ (xpos−0.25,xpos+0.25) ) in paint yellow ( t r a n s l a t e (xpos , ypos) ( e l l 0.2 0.2) )

IBall völlig unabhängig von Paddel und Wänden I Nützliche Funktionen:

while , when :: Behavior Bool→Event () step :: a →Event a→Behavior a stepAccum :: a→Event (a→a) →Behavior a

RP SS 2017 12 [14]

Warum nicht in Scala?

I Lifting und Typklassen fürsyntaktischen Zucker

I Aber: zentrales Konzept sindunendlicheListen (Ströme) mit nicht-strikteAuswertung

I Implementation mit Scala-Listen nicht möglich

I Benötigt:Strömeals unendliche Listen mit effizienter, nicht-strikter Auswertung

I Möglich, aber aufwändig

RP SS 2017 13 [14]

Zusammenfassung

I Funktional-Reaktive Programmierung am Beispiel FAL (Functional Animation Library)

I Zwei Kernkonzepte: kontinuierlichesVerhaltenund diskreteEreignisse I Implementiert in Haskell, Systemverhalten als unendlicher Strom von

Zuständen

I Stärke: ErlaubtabstrakteProgammierung vonreaktiven Animationen I Schwächen:

IFundamentalnicht-kompositional— ist gibteineHauptfunktion

IDebugging, Fehlerbehandlung, Nebenläufigkeit?

I Nächste Vorlesung: Software Transactional Memory (STM)

RP SS 2017 14 [14]

Referenzen

ÄHNLICHE DOKUMENTE

I Dynamische Tests führen das Programm unter kontrollierten Bedingungen aus, und prüfen das Ergebnis gegen eine gegebene Spezifikation. I Zentrale Frage: wo kommen die

I Systeme sind eingebettet, nebenläufig, reagieren auf ihre Umwelt.... Warum

I Wird durch Haskell Tysystem unterstützt (keine UI ohne IO) I Nützlich für andere UI mit Kontrollumkehr. I Beispiel: ein GUI für das Wörterratespiel

I Cold Observables fangen erst an Werte zu produzieren, wenn man ihnen zuhört.. Für jeden Observer

I Promises sind das Gegenstück zu Futures trait Promise {. def complete(result: Try[T]) def

Calling onSubscribe, onNext, onError or onComplete MUST return normally except when any provided parameter is null in which case it MUST throw a java.lang.NullPointerException to

I Werte vom Typ IO (Aktionen) können kombiniert werden wie alle anderen. I

[r]