49
in Seminar Methods and Applications of Functional Programming Johannes Kepler University, Linz SS2012 by Gerold Meisinger Functional reactive programming

Functional Reactive Programming by Gerold Meisinger

Embed Size (px)

Citation preview

Page 1: Functional Reactive Programming by Gerold Meisinger

inSeminar Methods and Applications of Functional Programming

Johannes Kepler University, Linz SS2012

by Gerold Meisinger

Functional reactive programming

Page 2: Functional Reactive Programming by Gerold Meisinger

Background

FH Hagenberg Digital Media

FRP diploma thesis Gamedev startup

”Modern Alchemists”

Page 3: Functional Reactive Programming by Gerold Meisinger

Types of programs

Transformative

Interactive

Reactive

Page 4: Functional Reactive Programming by Gerold Meisinger

What is FRP?

New paradigm Time-varying values

Behavior a :: Time → a Hybrid modeling

Continous-time Discrete events

React to input

Page 5: Functional Reactive Programming by Gerold Meisinger

Paradigms (by Van Roy)

Page 6: Functional Reactive Programming by Gerold Meisinger

Similarities

Paradigms Dataflow

Common Lisp/Cells Temporal logic Control theory ...

Languages Esterel Lustre Lucid Signal Synchrone Simulink Modelica ...

Page 7: Functional Reactive Programming by Gerold Meisinger

Dataflow programming

Page 8: Functional Reactive Programming by Gerold Meisinger

FRP implementations

Classic FRP e.g. Fran, FrTime

Push-pull FRP e.g. Reactive

Arrowized FRP e.g. Yampa, Elera

Page 9: Functional Reactive Programming by Gerold Meisinger

Yampa examples

Robotics GUIs Games Music synthesis Computer vision Networking ...

Page 10: Functional Reactive Programming by Gerold Meisinger

Classic game programming

interface IUpdateablevoid update( float elapsedTime )

class GameObject : IUpdateableVector3 positionVector3 velocityvoid update( float elapsedTime ) position += elapsedTime * velocity

Page 11: Functional Reactive Programming by Gerold Meisinger

Yampa semantics

Signal a :: Time → a Only used internally

SF a b :: Signal a → Signal b SF … signal function

data Event t = NoEvent | Event t

Page 12: Functional Reactive Programming by Gerold Meisinger

Yampa design goals

Continous-time & discrete events Denotative semantics Dynamic structures Higher-orderness Avoid time and space leaks ⇒ Arrow typeclass Synchronous (vs concurrent)

Page 13: Functional Reactive Programming by Gerold Meisinger

Transformative

f :: a → b

Page 14: Functional Reactive Programming by Gerold Meisinger

Interactive

Page 15: Functional Reactive Programming by Gerold Meisinger

Reactive

Page 16: Functional Reactive Programming by Gerold Meisinger

Temporal

Page 17: Functional Reactive Programming by Gerold Meisinger

Loop >

Page 18: Functional Reactive Programming by Gerold Meisinger

Loop > Processing (black-box)

Page 19: Functional Reactive Programming by Gerold Meisinger

Loop > Processing

Page 20: Functional Reactive Programming by Gerold Meisinger

Loop > Processing >

Page 21: Functional Reactive Programming by Gerold Meisinger

Loop > Processing > SF (BB)

Page 22: Functional Reactive Programming by Gerold Meisinger

Loop > Processing > SF

Page 23: Functional Reactive Programming by Gerold Meisinger

Loop > Processing > SF

Page 24: Functional Reactive Programming by Gerold Meisinger

Loop > Processing > SF

Page 25: Functional Reactive Programming by Gerold Meisinger

Loop > Processing > SF

Page 26: Functional Reactive Programming by Gerold Meisinger

Loop > Processing > SF Mover

Page 27: Functional Reactive Programming by Gerold Meisinger

Loop > Processing > Mover

Page 28: Functional Reactive Programming by Gerold Meisinger

Loop > Processing > Mover

Page 29: Functional Reactive Programming by Gerold Meisinger

Loop > Processing >

Page 30: Functional Reactive Programming by Gerold Meisinger

Loop > Processing

Page 31: Functional Reactive Programming by Gerold Meisinger

Loop > Processing

Page 32: Functional Reactive Programming by Gerold Meisinger

Loop > Processing Player

Page 33: Functional Reactive Programming by Gerold Meisinger

Example game: Fran

Page 34: Functional Reactive Programming by Gerold Meisinger

Haskell typeclasses (by Yorgey)

Page 35: Functional Reactive Programming by Gerold Meisinger

Arrow class

class Arrow a wherearr :: (b → c) → a b c(<<<) :: a b c → a c d → a b dfirst :: a b c → a (b, d) (c, d)

+ lots of arrow lawsderive combinators: second, (***), (&&&)

Page 36: Functional Reactive Programming by Gerold Meisinger

Arrow combinators

Page 37: Functional Reactive Programming by Gerold Meisinger

Derived Arrow combinators

second :: (Arrow a) a b c → a (d, b) (d, c)⇒

second f = arr swap >>> first f >>> arr swapwhere swap (a, b) = (b, a)

(***) :: (Arrow a) a b c → a b' c' → a (b, b') (c, c')⇒

f ⋆⋆⋆ g = first f >>> second g

(&&&) :: (Arrow a) a b c → a b c' → a b (c, c')⇒

f &&& g = arr (λx → (x, x)) >>> (f *** g)

Page 38: Functional Reactive Programming by Gerold Meisinger

ArrowCircuit

class Arrow a ArrowCircuit a where⇒

loop :: a (b, d) (c, d) → a b cinit :: b → a b b

+ even more laws

Page 39: Functional Reactive Programming by Gerold Meisinger

Arrow syntax

myArrow x y = proc (a, b) → do c1 ← arrow1 −< a c2 ← arrow3 <<< arrow2 −< b c ← arrow4 −< (c1, c2) rec d ← arrow5 −< (c, b, d) returnA (c, d)

Page 40: Functional Reactive Programming by Gerold Meisinger

Signal function primitives

Page 41: Functional Reactive Programming by Gerold Meisinger

Events

Page 42: Functional Reactive Programming by Gerold Meisinger

Yampa switch

switch :: SF in (out, Event t) → (t → SF in out) → SF in out

Page 43: Functional Reactive Programming by Gerold Meisinger

Yampa parallel switch

pSwitch :: Functor col => (forall sf. (in → col sf → col (ext, sf))) → col (SF ext out) → SF (in, col out) (Event mng) → (col (SF ext out) → mng → SF in (col out)) → SF in (col out)

Page 44: Functional Reactive Programming by Gerold Meisinger

Yampa switches

immediate delayedonce switch dSwitchrecurring rSwitch drSwitchparallel broadcasted pSwitchB

rpSwitchBdpSwitchBdrpSwitchB

parallel routed pSwitchrpSwitch

dpSwitchdrpSwitch

continuation kSwitch dkSwitch

Page 45: Functional Reactive Programming by Gerold Meisinger

Processing

reactimate :: IO (DTime, a) –- input → (b → IO ()) –- output → SF a b → IO ()

Page 46: Functional Reactive Programming by Gerold Meisinger

Game-Engine

Page 47: Functional Reactive Programming by Gerold Meisinger

Ongoing research

Semantics "Garbage collecting the semantics of FRP" "Why classic FRP does not fit interactive behavior"

Performance Causal Commutative Arrows (CCA) Concurrency Arrow tuples vs. signal combining

Page 48: Functional Reactive Programming by Gerold Meisinger

Yampa alternatives

ELM Web runtime and IDE => converts to JavaScripthttp://elm-lang.org

Reactive-Banana Many exampleshttp://apfelmus.nfshost.com

Page 49: Functional Reactive Programming by Gerold Meisinger

The End

http://lambdor.net