• Keine Ergebnisse gefunden

Reaktive Programmierung Vorlesung 3 vom 21.04.15: Funktional-Reaktive Programmierung

N/A
N/A
Protected

Academic year: 2022

Aktie "Reaktive Programmierung Vorlesung 3 vom 21.04.15: Funktional-Reaktive Programmierung"

Copied!
13
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Reaktive Programmierung

Vorlesung 3 vom 21.04.15: Funktional-Reaktive Programmierung

Christoph Lüth & Martin Ring

Universität Bremen

Sommersemester 2015

(2)

Fahrplan

I Teil I: Grundlegende Konzepte

I Was ist Reaktive Programmierung?

I Nebenläufigkeit und Monaden in Haskell

I Funktional-Reaktive Programmierung

I Einführung in Scala

I Die Scala Collections

I ScalaTest und ScalaCheck

I Teil II: Nebenläufigkeit

I Teil III: Fortgeschrittene Konzepte

(3)

Das Tagemenü

I Funktional-Reaktive Programmierung(FRP) istrein funktionale, reaktive Programmierung.

I Sehrabstraktes Konzept — 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.

(4)

FRP in a Nutshell

I Zwei Basiskonzepte

I Kontinuierliches, über der Zeit veränderlichesVerhalten:

type Time = Float

type Behaviour a = Time → a

I Diskrete Ereignissezu einem bestimmten Zeitpunkt:

type Event a = [ (Time, a ) ]

I Obige Typdefinitionen sindSpezifikation, nicht Implementation

(5)

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, . . . )

(6)

Reaktive Animationen: Verhaltensänderung

I Beispiel: auf Knopfdruck Farbe ändern:

color1 :: Behavior Color

color1 = red ‘ untilB ‘ lbp− blue

I Was passiert hier?

I untilB kombiniert Verhalten:

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

I =istmapfür Ereignisse:

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

ev = e =λ_ v

I Kombination von Ereignissen:

(7)

Reaktive Animationen: Verhaltensänderung

I Beispiel: auf Knopfdruck Farbe ändern:

color2r = red ‘ untilB ‘ ce where

ce = ( lbp − blue ‘ untilB ‘ ce ) .|. (key− yellow ‘ untilB ‘ ce )

I Was passiert hier?

I untilB kombiniert Verhalten:

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

I =istmapfür Ereignisse:

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

ev = e =λ_ v

I Kombination von Ereignissen:

(8)

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 v v = i n t e g r a l g ‘ switch ‘

( h i t ‘ snapshot_ ‘ v = λv ’→ l i f t 0 (−v ’ ) + i n t e g r a l g) h i t = 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)

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

(9)

Implementation

I Verhalten, erste Annäherung:

data Beh1 a = Beh1 ( [ ( UserAction , Time) ]→ Time→ a)

I Problem:Speicherleck und Ineffizienz

I Analogie: suche insortierten Listen 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 ]

(10)

Implementation

I Verhalten werdeninkrementell abgetastet:

data Beh2 a

= Beh2 ( [ ( UserAction ,Time) ] → [Time] → [ a ] )

I Verbesserungen:

I Zeit doppelt, nureinmal

I Abtastung auchohne Benutzeraktion

I Currying

data Behavior a

= Behavior ( ( [Maybe UserAction ] , [ Time] ) → [ a ] )

I Ereignisse sind im Prinzipoptionales Verhalten:

data Event a = Event ( Behaviour (Maybe a))

(11)

Längeres Beispiel: Paddleball

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 Der Ball:

pball v e l =

let xvel = v e l ‘stepAccum ‘ xbouncenegate xpos = i n t e g r a l xvel

xbounce = when (xpos > 2 | | ∗ xpos <∗ −2) yvel = v e l ‘stepAccum ‘ ybouncenegate 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))

I Die Mauern:

walls :: Behavior Picture

I . . . und alles zusammen:

(12)

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 nicht für diese Vorlesung

I Generelle Schwäche:

I Fundamentalnicht-kompositional— ist gibteineHauptfunktion

I Fehlerbehandlung, Nebenläufigkeit?

(13)

Zusammenfassung

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

I Zwei Kernkonzepte: kontinuierlichesVerhalten und diskreteEreignisse

I Implementiert in Haskell, Systemverhalten als unendlicher Strom von Zuständen

I Erlaubtabstrakte Progammierung vonreaktiven Animationen

I Problem ist mangelndeKompositionalität

I Nächste Vorlesungen:Scala!

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 Cold Observables fangen erst an Werte zu produzieren, wenn man ihnen zuhört.. Für jeden Observer

[r]

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

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

[r]

I Mengen und Maps sind gleich wenn sie die selben Elemente enthalten:. TreeSet(3,2,1) == HashSet(2,1,3)