43
MGS 2005 Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer Science and Information Technology University of Nottingham, UK MGS 2005: FRP, Lecture 3 –p.1/25

MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

MGS 2005Functional Reactive Programming

Lecture 3: Dynamic System Structure

Henrik Nilsson

School of Computer Science and Information Technology

University of Nottingham, UK

MGS 2005: FRP, Lecture 3 – p.1/25

Page 2: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Outline

• Describing systems with highly dynamicstructure: a generalized switch-construct.

• Example: Space Invaders

MGS 2005: FRP, Lecture 3 – p.2/25

Page 3: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Highly dynamic system structure?

The basic switch allows one signal function to bereplaced by another.

• What about more general structural changes?

• What about state?

MGS 2005: FRP, Lecture 3 – p.3/25

Page 4: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Highly dynamic system structure?

The basic switch allows one signal function to bereplaced by another.

• What about more general structural changes?

• What about state?

MGS 2005: FRP, Lecture 3 – p.3/25

Page 5: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Highly dynamic system structure?

The basic switch allows one signal function to bereplaced by another.

• What about more general structural changes?

• What about state?

MGS 2005: FRP, Lecture 3 – p.3/25

Page 6: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

The challenge

George Russel said on the Haskell GUI list:

“I have to say I’m very sceptical aboutthings like Fruit which rely on reactiveanimation, ever since I set our students anexercise implementing a simplespace-invaders game in such a system,and had no end of a job producing anexample solution. . . .

MGS 2005: FRP, Lecture 3 – p.4/25

Page 7: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

The challenge

George Russel said on the Haskell GUI list:

. . . My suspicion is that reactive animationworks very nicely for the examplesconstructed by reactive animation folk, butnot for my examples.”

MGS 2005: FRP, Lecture 3 – p.4/25

Page 8: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Example: Space Invaders

MGS 2005: FRP, Lecture 3 – p.5/25

Page 9: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Overall game structure

gun

alien

bullet

alien

...

killOrSpawn

ObjInput ObjOutput

} [ObjectOutput]

dpSwitch

route

MGS 2005: FRP, Lecture 3 – p.6/25

Page 10: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Dynamic signal function collections

Idea:

• Switch over collections of signal functions.• On event, “freeze” running signal functions

into collection of signal function continuations,preserving encapsulated state.

• Modify collection as needed and switch back in.

MGS 2005: FRP, Lecture 3 – p.7/25

Page 11: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Dynamic signal function collections

Idea:• Switch over collections of signal functions.

• On event, “freeze” running signal functionsinto collection of signal function continuations,preserving encapsulated state.

• Modify collection as needed and switch back in.

MGS 2005: FRP, Lecture 3 – p.7/25

Page 12: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Dynamic signal function collections

Idea:• Switch over collections of signal functions.• On event, “freeze” running signal functions

into collection of signal function continuations,preserving encapsulated state.

• Modify collection as needed and switch back in.

MGS 2005: FRP, Lecture 3 – p.7/25

Page 13: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Dynamic signal function collections

Idea:• Switch over collections of signal functions.• On event, “freeze” running signal functions

into collection of signal function continuations,preserving encapsulated state.

• Modify collection as needed and switch back in.

MGS 2005: FRP, Lecture 3 – p.7/25

Page 14: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Dynamic signal function collections

s1

s0

MGS 2005: FRP, Lecture 3 – p.8/25

Page 15: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Dynamic signal function collections

s1

s0

te

MGS 2005: FRP, Lecture 3 – p.8/25

Page 16: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Dynamic signal function collections

s1

s0

te

s2

s3

MGS 2005: FRP, Lecture 3 – p.8/25

Page 17: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Dynamic signal function collections

s1

s0

te

s2

s3

MGS 2005: FRP, Lecture 3 – p.8/25

Page 18: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Dynamic signal function collections

s1

s0

te

s2

s3

te2

MGS 2005: FRP, Lecture 3 – p.8/25

Page 19: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Dynamic signal function collections

s1

s0

te

s2

s3

te2

MGS 2005: FRP, Lecture 3 – p.8/25

Page 20: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

dpSwitch

Need ability to express:• How input routed to each signal function.• When collection changes shape.• How collection changes shape.

dpSwitch :: Functor col =>

(forall sf . (a -> col sf -> col (b,sf)))

-> col (SF b c)

-> SF (a, col c) (Event d)

-> (col (SF b c) -> d -> SF a (col c))

-> SF a (col c)

MGS 2005: FRP, Lecture 3 – p.9/25

Page 21: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

dpSwitch

Need ability to express:• How input routed to each signal function.• When collection changes shape.• How collection changes shape.

dpSwitch :: Functor col =>

(forall sf . (a -> col sf -> col (b,sf)))

-> col (SF b c) Routing function

-> SF (a, col c) (Event d)

-> (col (SF b c) -> d -> SF a (col c))

-> SF a (col c)

MGS 2005: FRP, Lecture 3 – p.9/25

Page 22: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

dpSwitch

Need ability to express:• How input routed to each signal function.• When collection changes shape.• How collection changes shape.

dpSwitch :: Functor col =>

(forall sf . (a -> col sf -> col (b,sf)))

-> col (SF b c) Initial collection

-> SF (a, col c) (Event d)

-> (col (SF b c) -> d -> SF a (col c))

-> SF a (col c)

MGS 2005: FRP, Lecture 3 – p.9/25

Page 23: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

dpSwitch

Need ability to express:• How input routed to each signal function.• When collection changes shape.• How collection changes shape.

dpSwitch :: Functor col =>

(forall sf . (a -> col sf -> col (b,sf)))

-> col (SF b c) Event source

-> SF (a, col c) (Event d)

-> (col (SF b c) -> d -> SF a (col c))

-> SF a (col c)

MGS 2005: FRP, Lecture 3 – p.9/25

Page 24: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

dpSwitch

Need ability to express:• How input routed to each signal function.• When collection changes shape.• How collection changes shape.

dpSwitch :: Functor col =>

(forall sf . (a -> col sf -> col (b,sf)))

-> col (SF b c) Function yielding SF to switch into

-> SF (a, col c) (Event d)

-> (col (SF b c) -> d -> SF a (col c))

-> SF a (col c)

MGS 2005: FRP, Lecture 3 – p.9/25

Page 25: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Routing

Idea:• The routing function decides which parts of

the input to pass to each running signalfunction instance.

• It achieves this by pairing a projection of theinput with each running instance:

a col sf

1

2

3

4

f

col (b,sf)

1

2

3

4

(

(

(

(

)

)

)

)

,

,

,

,

MGS 2005: FRP, Lecture 3 – p.10/25

Page 26: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Routing

Idea:• The routing function decides which parts of

the input to pass to each running signalfunction instance.

• It achieves this by pairing a projection of theinput with each running instance:

a col sf

1

2

3

4

f

col (b,sf)

1

2

3

4

(

(

(

(

)

)

)

)

,

,

,

,

MGS 2005: FRP, Lecture 3 – p.10/25

Page 27: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

The routing function type

Universal quantification over the collectionmembers:

Functor col =>

(forall sf . (a -> col sf -> col (b,sf)))

Collection members thus opaque:• Ensures only signal function instances from

argument can be returned.• Unfortunately, does not prevent duplication or

discarding of signal function instances.

MGS 2005: FRP, Lecture 3 – p.11/25

Page 28: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

The game core

gameCore :: IL Object

-> SF (GameInput, IL ObjOutput)

(IL ObjOutput)

gameCore objs =

dpSwitch route

objs

(arr killOrSpawn >>> notYet)

(\sfs’ f -> gameCore (f sfs’))

MGS 2005: FRP, Lecture 3 – p.12/25

Page 29: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Describing the alien behavior (1)

type Object = SF ObjInput ObjOutput

alien :: RandomGen g =>

g -> Position2 -> Velocity -> Object

alien g p0 vyd = proc oi -> do

rec

-- Pick a desired horizontal position

rx <- noiseR (xMin, xMax) g -< ()

smpl <- occasionally g 5 () -< ()

xd <- hold (point2X p0) -< smpl ‘tag‘ rx

...

MGS 2005: FRP, Lecture 3 – p.13/25

Page 30: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Describing the alien behavior (2)

...

-- Controller

let axd = 5 * (xd - point2X p)

- 3 * (vector2X v)

ayd = 20 * (vyd - (vector2Y v))

ad = vector2 axd ayd

h = vector2Theta ad

...

MGS 2005: FRP, Lecture 3 – p.14/25

Page 31: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Describing the alien behavior (3)

...

-- Physics

let a = vector2Polar

(min alienAccMax

(vector2Rho ad))

h

vp <- iPre v0 -< v

ffi <- forceField -< (p, vp)

v <- (v0 ˆ+ˆ) ˆ<< impulseIntegral

-< (gravity ˆ+ˆ a, ffi)

p <- (p0 .+ˆ) ˆ<< integral -< v

...MGS 2005: FRP, Lecture 3 – p.15/25

Page 32: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Describing the alien behavior (4)

...

-- Shields

sl <- shield -< oiHit oi

die <- edge -< sl <= 0

returnA -< ObjOutput {

ooObsObjState = oosAlien p h v,

ooKillReq = die,

ooSpawnReq = noEvent

}

where

v0 = zeroVectorMGS 2005: FRP, Lecture 3 – p.16/25

Page 33: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Recap: Overall game structure

gun

alien

bullet

alien

...

killOrSpawn

ObjInput ObjOutput

} [ObjectOutput]

dpSwitch

route

MGS 2005: FRP, Lecture 3 – p.17/25

Page 34: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Closing the feedback loop (1)

game :: RandomGen g =>

g -> Int -> Velocity -> Score ->

SF GameInput ((Int, [ObsObjState]),

Event (Either Score Score))

game g nAliens vydAlien score0 = proc gi -> do

rec

oos <- gameCore objs0 -< (gi, oos)

score <- accumHold score0

-< aliensDied oos

gameOver <- edge -< alienLanded oos

newRound <- edge -< noAliensLeft oos

...MGS 2005: FRP, Lecture 3 – p.18/25

Page 35: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Closing the feedback loop (2)...

returnA -< ((score,

map ooObsObjState

(elemsIL oos)),

(newRound ‘tag‘ (Left score))

‘lMerge‘ (gameOver

‘tag‘ (Right score)))

where

objs0 =

listToIL

(gun (Point2 0 50)

: mkAliens g (xMin+d) 900 nAliens)

MGS 2005: FRP, Lecture 3 – p.19/25

Page 36: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Other functional approaches?

Transition function operating on world model withexplicit state (e.g. Asteroids by Lüth):

• Model snapshot of world with all statecomponents.

• Transition function takes input and currentworld snapshot to output and the next worldsnapshot.

One could also use this technique within Yampato avoid switching over dynamic collections.

MGS 2005: FRP, Lecture 3 – p.20/25

Page 37: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Why use Yampa, then?

• Yampa provides a lot of functionality forprogramming with time-varying values:- Captures common patterns.- Carefully designed to facilitate reuse.

• Yampa allows state to be nicely encapsulatedby signal functions:- Avoids keeping track of all state globally.- Adding more state usually does not imply

any major changes to type or codestructure.

MGS 2005: FRP, Lecture 3 – p.21/25

Page 38: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

State in alien

Each of the following signal functions used inalien encapsulate state:

• noiseR

• occasionally

• hold

• iPre

• forceField

• impulseIntegral

• integral

• shield

• edge

MGS 2005: FRP, Lecture 3 – p.22/25

Page 39: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Why not imperative, then?

If state is so important, why not stick toimperative/object-oriented programming wherewe have “state for free”?

• Advantages of declarative programmingretained:- High abstraction level.- Referential transparency, algebraic laws:

formal reasoning ought to be simpler.

• Synchronous approach avoids“event-call-back soup”, meaning robust,easy-to-understand semantics.

MGS 2005: FRP, Lecture 3 – p.23/25

Page 40: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Why not imperative, then?

If state is so important, why not stick toimperative/object-oriented programming wherewe have “state for free”?

• Advantages of declarative programmingretained:- High abstraction level.- Referential transparency, algebraic laws:

formal reasoning ought to be simpler.

• Synchronous approach avoids“event-call-back soup”, meaning robust,easy-to-understand semantics.

MGS 2005: FRP, Lecture 3 – p.23/25

Page 41: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Why not imperative, then?

If state is so important, why not stick toimperative/object-oriented programming wherewe have “state for free”?

• Advantages of declarative programmingretained:- High abstraction level.- Referential transparency, algebraic laws:

formal reasoning ought to be simpler.• Synchronous approach avoids

“event-call-back soup”, meaning robust,easy-to-understand semantics.

MGS 2005: FRP, Lecture 3 – p.23/25

Page 42: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Yet some more reading

• Henrik Nilsson, Antony Courtney, and JohnPeterson. Functional reactive programming,continued. In Proceedings of the 2002Haskell Workshop, pp. 51–64, October 2002.

• Antony Courtney and Henrik Nilsson andJohn Peterson. The Yampa Arcade. InProceedings of the 2003 Haskell Workshop,pp. 7–18, August 2003.

MGS 2005: FRP, Lecture 3 – p.24/25

Page 43: MGS 2005 Functional Reactive Programmingpsznhn/MGS2005/LectureNotes/lecture3.pdf · Functional Reactive Programming Lecture 3: Dynamic System Structure Henrik Nilsson School of Computer

Obtaining Slides and Yampa

The lecture slides will be available from:http://www.cs.nott.ac.uk/~nhn

Yampa 0.92 is available from

http://www.haskell.org/yampa

MGS 2005: FRP, Lecture 3 – p.25/25