116
Implementing and Optimising Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School of Computer Science University of Nottingham, UK Implementing and Optimising FRP – p.1/46

Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Implementing and OptimisingFunctional Reactive Programming

Big-O Meetup, 14 Dec. 2016

Henrik Nilsson

School of Computer Science

University of Nottingham, UK

Implementing and Optimising FRP – p.1/46

Page 2: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Functional Reactive Programming (1)

Implementing and Optimising FRP – p.2/46

Page 3: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Functional Reactive Programming (1)

• Key idea: Don’t program one-time-step-at-a-time,but describe an evolving entity as whole.

Implementing and Optimising FRP – p.2/46

Page 4: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Functional Reactive Programming (1)

• Key idea: Don’t program one-time-step-at-a-time,but describe an evolving entity as whole.

• FRP originated in Conal Elliott and Paul Hudak’swork on Functional Reactive Animation (Fran).(Highly cited 1997 ICFP paper; ICFP awardfor most influential paper in 2007.)

Implementing and Optimising FRP – p.2/46

Page 5: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Functional Reactive Programming (1)

• Key idea: Don’t program one-time-step-at-a-time,but describe an evolving entity as whole.

• FRP originated in Conal Elliott and Paul Hudak’swork on Functional Reactive Animation (Fran).(Highly cited 1997 ICFP paper; ICFP awardfor most influential paper in 2007.)

• FRP has evolved in a number of directionsand into different concrete implementations.

Implementing and Optimising FRP – p.2/46

Page 6: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Functional Reactive Programming (1)

• Key idea: Don’t program one-time-step-at-a-time,but describe an evolving entity as whole.

• FRP originated in Conal Elliott and Paul Hudak’swork on Functional Reactive Animation (Fran).(Highly cited 1997 ICFP paper; ICFP awardfor most influential paper in 2007.)

• FRP has evolved in a number of directionsand into different concrete implementations.

• This talk considers Yampa: an arrows-basedFRP system embedded in Haskell.

Implementing and Optimising FRP – p.2/46

Page 7: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Functional Reactive Programming (2)

• Yampa: pure and principled implementation ina pure setting.

Implementing and Optimising FRP – p.3/46

Page 8: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Functional Reactive Programming (2)

• Yampa: pure and principled implementation ina pure setting.

• In particular: many algebraic laws hold.

Implementing and Optimising FRP – p.3/46

Page 9: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Functional Reactive Programming (2)

• Yampa: pure and principled implementation ina pure setting.

• In particular: many algebraic laws hold.

• These guide the implementation andoptimisations: a theme of this talk.

Implementing and Optimising FRP – p.3/46

Page 10: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

FRP Applications (1)

Some domains where FRP or FRP-inspiredapproaches have been used:

• Robotics

• Vision

• Sound synthesis

• GUIs

• Virtual Reality Environments

• Games

• Distributed Event-based Systems

Implementing and Optimising FRP – p.4/46

Page 11: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

FRP Applications (2)

Example: Breakout in Yampa (and SDL) on a tablet:

Implementing and Optimising FRP – p.5/46

Page 12: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Take-home Game!

Or download one for free to your Android device!

Play Store: Pang-a-lambda (Keera Studios)Implementing and Optimising FRP – p.6/46

Page 13: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Arrows?

• A notion of computation: function-likeentities that may have effects.

Implementing and Optimising FRP – p.7/46

Page 14: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Arrows?

• A notion of computation: function-likeentities that may have effects.

• Examples:

Implementing and Optimising FRP – p.7/46

Page 15: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Arrows?

• A notion of computation: function-likeentities that may have effects.

• Examples:

- Pure functions

Implementing and Optimising FRP – p.7/46

Page 16: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Arrows?

• A notion of computation: function-likeentities that may have effects.

• Examples:

- Pure functions

- “Functions” with internal state

Implementing and Optimising FRP – p.7/46

Page 17: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Arrows?

• A notion of computation: function-likeentities that may have effects.

• Examples:

- Pure functions

- “Functions” with internal state

- Conditional probabilities

Implementing and Optimising FRP – p.7/46

Page 18: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Arrows?

• A notion of computation: function-likeentities that may have effects.

• Examples:

- Pure functions

- “Functions” with internal state

- Conditional probabilities

- Any function of the form a → M b where Mis a monad (the “Kleisli construction”).

Implementing and Optimising FRP – p.7/46

Page 19: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Arrows?

• A notion of computation: function-likeentities that may have effects.

• Examples:

- Pure functions

- “Functions” with internal state

- Conditional probabilities

- Any function of the form a → M b where Mis a monad (the “Kleisli construction”).

• A number of algebraic laws must besatisfied: we will come back to those.

Implementing and Optimising FRP – p.7/46

Page 20: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Arrows?

• A notion of computation: function-likeentities that may have effects.

• Examples:

- Pure functions

- “Functions” with internal state

- Conditional probabilities

- Any function of the form a → M b where Mis a monad (the “Kleisli construction”).

• A number of algebraic laws must besatisfied: we will come back to those.

• Arrows due to Prof. John Hughes.Implementing and Optimising FRP – p.7/46

Page 21: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

The Arrow framework (1)

arr f f >>> g

first f loop f

Types signatures for some arrow F:

arr :: (a -> b) -> F a b

(>>>) :: F a b -> F b c -> F a c

first :: F a b -> F (a,c) (b,c)

loop :: F (a, c) (b, c) -> F a bImplementing and Optimising FRP – p.8/46

Page 22: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

The Arrow framework (2)

Some derived combinators:

f *** g f &&& g

(***) :: F a b -> F c d -> F (a,c) (b,d)

(&&&) :: F a b -> F a c -> F a (b,c)

Implementing and Optimising FRP – p.9/46

Page 23: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Constructing a network

Implementing and Optimising FRP – p.10/46

Page 24: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Constructing a network

Implementing and Optimising FRP – p.10/46

Page 25: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Constructing a network

Tedious way to program?

Implementing and Optimising FRP – p.10/46

Page 26: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Constructing a network

Tedious way to program?

Yes, can be. But syntactic support can be provided.

Implementing and Optimising FRP – p.10/46

Page 27: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Key FRP Features

Combines conceptual simplicity of the synchronousdata flow approach with the flexibility and abstractionpower of higher-order functional programming:

• Synchronous

• First class temporal abstractions

• Hybrid: mixed continuous and discrete time

• Dynamic system structure

Implementing and Optimising FRP – p.11/46

Page 28: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Key FRP Features

Combines conceptual simplicity of the synchronousdata flow approach with the flexibility and abstractionpower of higher-order functional programming:

• Synchronous

• First class temporal abstractions

• Hybrid: mixed continuous and discrete time

• Dynamic system structure

(But not everything labelled “FRP” supports themall.)

Implementing and Optimising FRP – p.11/46

Page 29: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Yampa (1)

Implementing and Optimising FRP – p.12/46

Page 30: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Yampa (1)

• FRP implemenattion embedded in Haskell

Implementing and Optimising FRP – p.12/46

Page 31: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Yampa (1)

• FRP implemenattion embedded in Haskell

• Key concepts:

- Signals: time-varying values

- Signal Functions: functions on signals

- Switching between signal functions

Implementing and Optimising FRP – p.12/46

Page 32: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Yampa (1)

• FRP implemenattion embedded in Haskell

• Key concepts:

- Signals: time-varying values

- Signal Functions: functions on signals

- Switching between signal functions

• Programming model:

Implementing and Optimising FRP – p.12/46

Page 33: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Yampa (2)

• Signal functions are the primary notion:first-class entities.

Implementing and Optimising FRP – p.13/46

Page 34: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Yampa (2)

• Signal functions are the primary notion:first-class entities.

• Signals are a secondary notion: only existindirectly.

Implementing and Optimising FRP – p.13/46

Page 35: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Yampa (2)

• Signal functions are the primary notion:first-class entities.

• Signals are a secondary notion: only existindirectly.

• This is a key aspect allowing for a fundamentallysimple, pure, implementation.

Implementing and Optimising FRP – p.13/46

Page 36: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Yampa (2)

• Signal functions are the primary notion:first-class entities.

• Signals are a secondary notion: only existindirectly.

• This is a key aspect allowing for a fundamentallysimple, pure, implementation.

• Of course, FRP does not have to be implementedpurely, and many FRP implementations areindeed not pure. But keeping it pure makes iteasier to get correct. Good for reference ifnothing else.

Implementing and Optimising FRP – p.13/46

Page 37: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Yampa?

Implementing and Optimising FRP – p.14/46

Page 38: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Yampa?

Yet Another Mostly Pointless Acronym?

Implementing and Optimising FRP – p.14/46

Page 39: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Yampa?

Yet Another Mostly Pointless Acronym?

Yampa is a river with long calmly flowing sectionsand abrupt whitewater transitions in between.

A good metaphor for hybrid systems!Implementing and Optimising FRP – p.14/46

Page 40: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Signal Functions

Implementing and Optimising FRP – p.15/46

Page 41: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Signal Functions

Intuition:

Implementing and Optimising FRP – p.15/46

Page 42: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Signal Functions

Intuition:

Time ≈ R

Implementing and Optimising FRP – p.15/46

Page 43: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Signal Functions

Intuition:

Time ≈ R

Signal a ≈ Time -> a

x :: Signal T1

y :: Signal T2

Implementing and Optimising FRP – p.15/46

Page 44: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Signal Functions

Intuition:

Time ≈ R

Signal a ≈ Time -> a

x :: Signal T1

y :: Signal T2

SF a b ≈ Signal a -> Signal b

f :: SF T1 T2

Implementing and Optimising FRP – p.15/46

Page 45: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Signal Functions

Intuition:

Time ≈ R

Signal a ≈ Time -> a

x :: Signal T1

y :: Signal T2

SF a b ≈ Signal a -> Signal b

f :: SF T1 T2

Additionally, causality required: output at time tmust be determined by input on interval [0, t].

Implementing and Optimising FRP – p.15/46

Page 46: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Signal Functions and State

Alternative view:

Implementing and Optimising FRP – p.16/46

Page 47: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Signal Functions and State

Alternative view:

Signal functions can encapsulate state.

state(t) summarizes input history x(t′), t′ ∈ [0, t].

Implementing and Optimising FRP – p.16/46

Page 48: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Signal Functions and State

Alternative view:

Signal functions can encapsulate state.

state(t) summarizes input history x(t′), t′ ∈ [0, t].

From this perspective, signal functions are:

• stateful if y(t) depends on x(t) and state(t)

• stateless if y(t) depends only on x(t)

Implementing and Optimising FRP – p.16/46

Page 49: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Signal Functions and State

Alternative view:

Signal functions can encapsulate state.

state(t) summarizes input history x(t′), t′ ∈ [0, t].

From this perspective, signal functions are:

• stateful if y(t) depends on x(t) and state(t)

• stateless if y(t) depends only on x(t)

Signal functions form an arrow.

Implementing and Optimising FRP – p.16/46

Page 50: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Some Basic Signal Functions

identity :: SF a a

Implementing and Optimising FRP – p.17/46

Page 51: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Some Basic Signal Functions

identity :: SF a a

constant :: b -> SF a b

Implementing and Optimising FRP – p.17/46

Page 52: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Some Basic Signal Functions

identity :: SF a a

constant :: b -> SF a b

iPre :: a -> SF a a

Implementing and Optimising FRP – p.17/46

Page 53: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Some Basic Signal Functions

identity :: SF a a

constant :: b -> SF a b

iPre :: a -> SF a a

integral :: VectorSpace a s=>SF a a

y(t) =

t∫

0

x(τ) dτ

Implementing and Optimising FRP – p.17/46

Page 54: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic implementation: SF (1)

Each signal function is essentially representedby a transition function. Arguments:

• Time passed since the previous time step.

• The current input value.

Returns:

• A (possibly) updated representation of thesignal function, the continuation.

• The current value of the output signal.

Implementing and Optimising FRP – p.18/46

Page 55: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic implementation: SF (2)

type DTime = Double

data SF a b =

SF {sfTF :: DTime -> a

-> Transition a b}

type Transition a b = (SF a b, b)

The continuation encapsulates any internal stateof the signal function. The type synonym DTime

is the type used for the time deltas, > 0.

Implementing and Optimising FRP – p.19/46

Page 56: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic impl.: reactimate (1)

The function reactimate is responsible foranimating a signal function:

Implementing and Optimising FRP – p.20/46

Page 57: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic impl.: reactimate (1)

The function reactimate is responsible foranimating a signal function:

• Loops over the sampling points.

Implementing and Optimising FRP – p.20/46

Page 58: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic impl.: reactimate (1)

The function reactimate is responsible foranimating a signal function:

• Loops over the sampling points.

• At each sampling point:

Implementing and Optimising FRP – p.20/46

Page 59: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic impl.: reactimate (1)

The function reactimate is responsible foranimating a signal function:

• Loops over the sampling points.

• At each sampling point:

- reads input sample and time from theexternal environment (typically I/O action)

Implementing and Optimising FRP – p.20/46

Page 60: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic impl.: reactimate (1)

The function reactimate is responsible foranimating a signal function:

• Loops over the sampling points.

• At each sampling point:

- reads input sample and time from theexternal environment (typically I/O action)

- feeds sample and time passed sinceprevious sampling into the signal function’stransition function

Implementing and Optimising FRP – p.20/46

Page 61: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic impl.: reactimate (1)

The function reactimate is responsible foranimating a signal function:

• Loops over the sampling points.

• At each sampling point:

- reads input sample and time from theexternal environment (typically I/O action)

- feeds sample and time passed sinceprevious sampling into the signal function’stransition function

- writes the resulting output sample to theenvironment (typically I/O action).

Implementing and Optimising FRP – p.20/46

Page 62: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic impl.: reactimate (2)

• The loop then repeats, but uses thecontinuation returned from the transitionfunction on the next iteration, thus ensuringany internal state is maintained.

Implementing and Optimising FRP – p.21/46

Page 63: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic implementation: arr

arr :: (a -> b) -> SF a b

arr f = sf

where

sf = SF {sfTF = \_ a -> (sf, f a)}

Note: It is obvious that arr constructs astateless signal function since the returnedcontinuation is exactly the signal function beingdefined, i.e. it never changes.

Implementing and Optimising FRP – p.22/46

Page 64: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic implementation: >>>

For >>>, we have to combine their continuationsinto updated continuation for the composed arrow:

(>>>) :: SF a b -> SF b c -> SF a c

(SF {sfTF = tf1}) >>> (SF {sfTF=tf2}) =

SF {sfTF = tf}where

tf dt a = (sf1’ >>> sf2’, c)

where

(sf1’, b) = tf1 dt a

(sf2’, c) = tf2 dt b

Note how same time delta is fed to both subordinatesignal functions, thus ensuring synchrony.

Implementing and Optimising FRP – p.23/46

Page 65: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic impl.: How to get started? (1)

What should the very first time delta be?

Implementing and Optimising FRP – p.24/46

Page 66: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic impl.: How to get started? (1)

What should the very first time delta be?

• Could use 0, but that would violate theassumption of positive time deltas (timealways progressing), and is a bit of a hack.

Implementing and Optimising FRP – p.24/46

Page 67: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic impl.: How to get started? (1)

What should the very first time delta be?

• Could use 0, but that would violate theassumption of positive time deltas (timealways progressing), and is a bit of a hack.

• Instead:

- Initial SF representation makes a firsttransition given just an input sample.

- Makes that transition into a representationthat expects time deltas from then on.

Implementing and Optimising FRP – p.24/46

Page 68: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

A basic impl.: How to get started? (2)

data SF a b =

SF {sfTF :: a -> Transition a b}

data SF’ a b =

SF’ {sfTF’ :: DTime -> a

-> Transition a b}

type Transition a b = (SF’ a b, b)

SF’ is internal, can be thought of as representinga “running” signal function.

Implementing and Optimising FRP – p.25/46

Page 69: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: First Attempt (1)

The arrow identity law:

arr id >>> a = a = a >>> arr id

Implementing and Optimising FRP – p.26/46

Page 70: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: First Attempt (1)

The arrow identity law:

arr id >>> a = a = a >>> arr id

How can this be exploited?

Implementing and Optimising FRP – p.26/46

Page 71: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: First Attempt (1)

The arrow identity law:

arr id >>> a = a = a >>> arr id

How can this be exploited?

1. Introduce a constructor representing arr id

data SF a b = ...

| SFId

| ...

Implementing and Optimising FRP – p.26/46

Page 72: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: First Attempt (1)

The arrow identity law:

arr id >>> a = a = a >>> arr id

How can this be exploited?

1. Introduce a constructor representing arr id

data SF a b = ...

| SFId

| ...

2. Make SF abstract by hiding all itsconstructors.

Implementing and Optimising FRP – p.26/46

Page 73: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: First Attempt (2)

3. Ensure SFId only gets used at intended type:

identity :: SF a a

identity = SFId

Implementing and Optimising FRP – p.27/46

Page 74: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: First Attempt (2)

3. Ensure SFId only gets used at intended type:

identity :: SF a a

identity = SFId

4. Define optimizing version of >>>:

(>>>) :: SF a b -> SF b c -> SF a c

...

SFId >>> sf = sf

...

Implementing and Optimising FRP – p.27/46

Page 75: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: First Attempt (2)

3. Ensure SFId only gets used at intended type:

identity :: SF a a

identity = SFId

4. Define optimizing version of >>>:

(>>>) :: SF a b -> SF b c -> SF a c

...

SFId >>> sf = sf

...

:: SF b c 6= SF a c

Implementing and Optimising FRP – p.27/46

Page 76: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

No optimization possible?

The type system does not get in the way of alloptimizations. For example, for:

constant :: b -> SF a b

constant b = arr (const b)

the following laws can readily be exploited:

sf >>> constant c = constant c

constant c >>> arr f = constant (f c)

But to do better, we need GADTs.

Implementing and Optimising FRP – p.28/46

Page 77: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Generalized Algebraic Data Types

GADTs allow

• individual specification of return type ofconstructors

• the more precise type information to be takeninto account during case analysis.

Implementing and Optimising FRP – p.29/46

Page 78: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: Second Attempt (1)

Instead of

data SF a b = ...

| SFId

| ...

Implementing and Optimising FRP – p.30/46

Page 79: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: Second Attempt (1)

Instead of

data SF a b = ...

| SFId

| ... :: SF a b

Implementing and Optimising FRP – p.30/46

Page 80: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: Second Attempt (1)

Instead of

data SF a b = ...

| SFId

| ... :: SF a b

we define

data SF a b where

...

SFId :: SF a a

...

Implementing and Optimising FRP – p.30/46

Page 81: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: Second Attempt (2)

Define optimizing version of >>> exactly asbefore:

(>>>) :: SF a b -> SF b c -> SF a c

...

Implementing and Optimising FRP – p.31/46

Page 82: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: Second Attempt (2)

Define optimizing version of >>> exactly asbefore:

(>>>) :: SF a b -> SF b c -> SF a c

...

SFId >>> sf = sf

...

Implementing and Optimising FRP – p.31/46

Page 83: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: Second Attempt (2)

Define optimizing version of >>> exactly asbefore:

(>>>) :: SF a b -> SF b c -> SF a c

...

SFId >>> sf = sf

...

:: SF a a

Implementing and Optimising FRP – p.31/46

Page 84: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optmimizing >>>: Second Attempt (2)

Define optimizing version of >>> exactly asbefore:

(>>>) :: SF a b -> SF b c -> SF a c

...

SFId >>> sf = sf

...

:: SF a a :: SF a c

Implementing and Optimising FRP – p.31/46

Page 85: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Other Ways? Statically?

• Other (typed) approaches include keepingcoercion functions around as “evidence” foruse at runtime (Hughes 2004). But imposesan overhead.

Implementing and Optimising FRP – p.32/46

Page 86: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Other Ways? Statically?

• Other (typed) approaches include keepingcoercion functions around as “evidence” foruse at runtime (Hughes 2004). But imposesan overhead.

• When network structure is static, optimizationscan be carried out once and for all. ButYampa networks may evolve over time.

Implementing and Optimising FRP – p.32/46

Page 87: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Other Ways? Statically?

• Other (typed) approaches include keepingcoercion functions around as “evidence” foruse at runtime (Hughes 2004). But imposesan overhead.

• When network structure is static, optimizationscan be carried out once and for all. ButYampa networks may evolve over time.

arr g >>> switch (...) (\_ -> arr f)switch=⇒ arr g >>> arr f = arr (f . g)

Implementing and Optimising FRP – p.32/46

Page 88: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Laws Exploited for Optimizations

General arrow laws:

(f >>> g) >>> h = f >>> (g >>> h)

arr (g . f) = arr f >>> arr g

arr id >>> f = f

f = f >>> arr id

Laws involving const (the first is Yampa-specific):

sf >>> arr (const k) = arr (const k)

arr (const k)>>>arr f = arr (const(f k))

Implementing and Optimising FRP – p.33/46

Page 89: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Causal Commutative Arrows

• The Yampa arrow satisfies additional laws: inparticular it is commutative, meaningordering between signal functions composedin parallel is irrelevant.

Implementing and Optimising FRP – p.34/46

Page 90: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Causal Commutative Arrows

• The Yampa arrow satisfies additional laws: inparticular it is commutative, meaningordering between signal functions composedin parallel is irrelevant.

• This can be exploited (Liu, Cheng, Hudak 2009)to define a Causal Commutative NormalForm (CCNF) for switch-free networks.

Implementing and Optimising FRP – p.34/46

Page 91: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Causal Commutative Arrows

• The Yampa arrow satisfies additional laws: inparticular it is commutative, meaningordering between signal functions composedin parallel is irrelevant.

• This can be exploited (Liu, Cheng, Hudak 2009)to define a Causal Commutative NormalForm (CCNF) for switch-free networks.

• Essentially CCNF is a Mealy Machine.

Implementing and Optimising FRP – p.34/46

Page 92: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Causal Commutative Arrows

• The Yampa arrow satisfies additional laws: inparticular it is commutative, meaningordering between signal functions composedin parallel is irrelevant.

• This can be exploited (Liu, Cheng, Hudak 2009)to define a Causal Commutative NormalForm (CCNF) for switch-free networks.

• Essentially CCNF is a Mealy Machine.

• Not exploited in Yampa, but this optimization hasbeen used to obtain performance gains of twoorders of magnitude (over Yampa-like performance).

Implementing and Optimising FRP – p.34/46

Page 93: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Implementation (1)

data SF a b where

SFArr ::

(DTime -> a -> (SF a b, b))

-> FunDesc a b

-> SF a b

SFCpAXA ::

(DTime -> a -> (SF a d, d))

-> FunDesc a b->SF b c->FunDesc c d

-> SF a d

SF ::

(DTime -> a -> (SF a b, b))

-> SF a b

Implementing and Optimising FRP – p.35/46

Page 94: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Implementation (2)

data FunDesc a b where

FDI :: FunDesc a a

FDC :: b -> FunDesc a b

FDG :: (a -> b) -> FunDesc a b

Implementing and Optimising FRP – p.36/46

Page 95: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Implementation (2)

data FunDesc a b where

FDI :: FunDesc a a

FDC :: b -> FunDesc a b

FDG :: (a -> b) -> FunDesc a b

Implementing and Optimising FRP – p.36/46

Page 96: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Implementation (2)

data FunDesc a b where

FDI :: FunDesc a a

FDC :: b -> FunDesc a b

FDG :: (a -> b) -> FunDesc a b

Recovering the function from a FunDesc:

fdFun :: FunDesc a b -> (a -> b)

fdFun FDI = id

fdFun (FDC b) = const b

fdFun (FDG f) = f

Implementing and Optimising FRP – p.36/46

Page 97: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Implementation (2)

data FunDesc a b where

FDI :: FunDesc a a

FDC :: b -> FunDesc a b

FDG :: (a -> b) -> FunDesc a b

Recovering the function from a FunDesc:

fdFun :: FunDesc a b -> (a -> b)

fdFun FDI = id

fdFun (FDC b) = const b

fdFun (FDG f) = f

Implementing and Optimising FRP – p.36/46

Page 98: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Implementation (3)

fdComp :: FunDesc a b -> FunDesc b c

-> FunDesc a c

fdComp FDI fd2 = fd2

fdComp fd1 FDI = fd1

fdComp (FDC b) fd2 =

FDC ((fdFun fd2) b)

fdComp _ (FDC c) = FDC c

fdComp (FDG f1) fd2 =

FDG (fdFun fd2 . f1)

Implementing and Optimising FRP – p.37/46

Page 99: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Events

Yampa models discrete-time signals by liftingthe range of continuous-time signals:

data Event a = NoEvent | Event a

Discrete-time signal = Signal (Eventα).

Implementing and Optimising FRP – p.38/46

Page 100: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Events

Yampa models discrete-time signals by liftingthe range of continuous-time signals:

data Event a = NoEvent | Event a

Discrete-time signal = Signal (Eventα).

Consider composition of pure event processing:

f :: Event a -> Event b

g :: Event b -> Event c

arr f >>> arr g

Implementing and Optimising FRP – p.38/46

Page 101: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optimizing Event Processing (1)

Additional function descriptor:

data FunDesc a b where

...

FDE :: (Event a -> b) -> b

-> FunDesc (Event a) b

Implementing and Optimising FRP – p.39/46

Page 102: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optimizing Event Processing (1)

Additional function descriptor:

data FunDesc a b where

...

FDE :: (Event a -> b) -> b

-> FunDesc (Event a) b

Implementing and Optimising FRP – p.39/46

Page 103: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optimizing Event Processing (1)

Additional function descriptor:

data FunDesc a b where

...

FDE :: (Event a -> b) -> b

-> FunDesc (Event a) b

Extend the composition function:

fdComp (FDE f1 f1ne) fd2 =

FDE (f2 . f1) (f2 f1ne)

where

f2 = fdFun fd2

Implementing and Optimising FRP – p.39/46

Page 104: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optimizing Event Processing (2)

Extend the composition function:

fdComp (FDG f1) (FDE f2 f2ne) = FDG f

where

f a =

case f1 a of

NoEvent -> f2ne

f1a -> f2 f1a

Implementing and Optimising FRP – p.40/46

Page 105: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optimizing Event Processing (2)

Extend the composition function:

fdComp (FDG f1) (FDE f2 f2ne) = FDG f

where

f a =

case f1 a of

NoEvent -> f2ne

f1a -> f2 f1a

Implementing and Optimising FRP – p.40/46

Page 106: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optimizing Stateful Event Processing

A general stateful event processor:

ep :: (c -> a -> (c,b,b)) -> c -> b

-> SF (Event a) b

Implementing and Optimising FRP – p.41/46

Page 107: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optimizing Stateful Event Processing

A general stateful event processor:

ep :: (c -> a -> (c,b,b)) -> c -> b

-> SF (Event a) b

Composes nicely with stateful and statelessevent processors!

Implementing and Optimising FRP – p.41/46

Page 108: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Optimizing Stateful Event Processing

A general stateful event processor:

ep :: (c -> a -> (c,b,b)) -> c -> b

-> SF (Event a) b

Composes nicely with stateful and statelessevent processors!Introduce explicit representation:

data SF a b where

...

SFEP :: ...

-> (c -> a -> (c, b, b)) -> c -> b

-> SF (Event a) b

Implementing and Optimising FRP – p.41/46

Page 109: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Cause for Concern

Code with GADT-based optimizations is gettinglarge and complicated:

• Many more cases to consider.

• Larger size of signal function representation.

Implementing and Optimising FRP – p.42/46

Page 110: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Cause for Concern

Code with GADT-based optimizations is gettinglarge and complicated:

• Many more cases to consider.

• Larger size of signal function representation.

Is the result really a performance improvement?

Implementing and Optimising FRP – p.42/46

Page 111: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Cause for Concern

Code with GADT-based optimizations is gettinglarge and complicated:

• Many more cases to consider.

• Larger size of signal function representation.

Is the result really a performance improvement?A number of Micro Benchmarks were carried outto verify that individual optimizations worked asintended, including:

• Space Invaders

• MIDI Event Processor

Implementing and Optimising FRP – p.42/46

Page 112: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Benchmark 1: Space Invaders

Implementing and Optimising FRP – p.43/46

Page 113: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Benchmark 2: MIDI Event Processor

High-level model of a MIDI event processorprogrammed to perform typical duties:

Implementing and Optimising FRP – p.44/46

Page 114: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

The MEP4

Implementing and Optimising FRP – p.45/46

Page 115: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Results

Benchmark TU [s] TO [s] TO/TU

Space Inv. 0.95 0.86 0.93

MEP 19.39 10.31 0.48

Implementing and Optimising FRP – p.46/46

Page 116: Implementing and Optimising Functional Reactive Programmingpsznhn/Talks/BigO-ImplFRP-Dec2016.pdf · Functional Reactive Programming Big-O Meetup, 14 Dec. 2016 Henrik Nilsson School

Results

Benchmark TU [s] TO [s] TO/TU

Space Inv. 0.95 0.86 0.93

MEP 19.39 10.31 0.48

Most important gains:

• Insensitive to bracketing.

• A number of “pre-composed” combinators nolonger needed, thus simplifying the YampaAPI (and implementation).

• Much better event processing.

Implementing and Optimising FRP – p.46/46