Difference between revisions of "Functional Reactive Programming"
(Added a brief explanation in the new section "Introduction"; copied froman e-mail from Ertugrul Söylemez, with permission) |
Aleksandar (talk | contribs) |
||
(7 intermediate revisions by 3 users not shown) | |||
Line 4: | Line 4: | ||
== Introduction == |
== Introduction == |
||
+ | The original formulation of Functional Reactive Programming can be found in the ICFP 97 paper [http://conal.net/papers/icfp97/ Functional Reactive Animation] by Conal Elliott and Paul Hudak. |
||
− | FRP is about domain-specific languages that capture the notion of |
||
− | time-varying values. Let's take Netwire 4 as an example. It's not on |
||
− | Hackage yet, so you may want to grab it using darcs: |
||
− | |||
− | darcs get http://darcs.ertes.de/netwire/ |
||
+ | === Behaviors === |
||
− | Imagine you have a simple GUI label that displays the number of seconds |
||
− | passed since program start. In an event-based model this is actually |
||
− | quite a complicated task. You would have to create a label and update |
||
− | it all the time using some form of timer/idle event. In Netwire you |
||
− | write: |
||
− | |||
− | myLabel = time |
||
+ | Traditionally a widget-based user interface is created by a series of imperative actions. First an action is invoked to create an edit widget, then additional actions can be invoked to read its current content, set it to a specific value or to assign an event callback for when the content changes. This is tedious and error-prone. |
||
− | Now let's say you want to have the same GUI, but the time should start |
||
− | at 10 and pass twice as fast, so you actually want to display twice the |
||
− | number of seconds passed plus 10: |
||
− | |||
− | myLabel = 10 + 2*time |
||
+ | A better way to represent an edit widget's content is a time-varying value, called a ''behavior''. The basic idea is that a time-varying value can be represented as a function of time: |
||
− | Imagine you want to display the string "yes" in a label: |
||
− | |||
− | myLabel = "yes" |
||
+ | <haskell> |
||
− | Now let's say you want to display "yes", when the space key is held down |
||
+ | newtype Behavior a = |
||
− | and "no" otherwise: |
||
+ | Behavior { |
||
− | |||
− | + | at :: Time -> a |
|
+ | } |
||
+ | myName :: Behavior Text |
||
− | You want to display time while pressed and "Press space" while not: |
||
− | |||
− | myLabel = fmap show time . keyDown Space <|> "Press space" |
||
+ | myName `at` yesterday |
||
− | You want to display "yes" every other second and "no" otherwise: |
||
+ | </haskell> |
||
− | |||
+ | |||
− | myLabel = "yes" . holdFor 1 (periodically 2) <|> "no" |
||
+ | This is only a theoretical model, because a time-varying value can represent something impure like the content of an edit widget, the current value of a database entry as well as the system clock's current time. Using this model the current content of an edit widget would be a regular first class value: |
||
+ | |||
+ | <haskell> |
||
+ | myEditWidget :: Behavior Text |
||
+ | </haskell> |
||
+ | |||
+ | In most frameworks there is an applicative interface for behaviors, such that you can combine them easily: |
||
+ | |||
+ | <haskell> |
||
+ | liftA2 (<>) myEdit1 myEdit2 |
||
+ | </haskell> |
||
+ | |||
+ | The result is a time-varying value that represents the concatenation of <hask>myEdit1</hask> and <hask>myEdit2</hask>. This could be the value of a third widget, a label, to display the concatenation. The following is a hypothetical example: |
||
+ | |||
+ | <haskell> |
||
+ | do edit1 <- editWidget |
||
+ | edit2 <- editWidget |
||
+ | label <- label (liftA2 (<>) edit1 edit2) |
||
+ | {- ... -} |
||
+ | </haskell> |
||
+ | |||
+ | Without behaviors you would have to write event callback ''actions'' for the edit widgets to ''update'' the label's content. With behaviors you can express this relationship declaratively. |
||
+ | |||
+ | === Events === |
||
+ | |||
+ | ''To do'' |
||
− | Imagine doing that with event-based code. |
||
− | |||
− | Summary: FRP is about handling time-varying values like they were |
||
− | regular values. |
||
− | |||
− | |||
== Libraries == |
== Libraries == |
||
* [http://hackage.haskell.org/package/sodium Sodium] |
* [http://hackage.haskell.org/package/sodium Sodium] |
||
Line 58: | Line 61: | ||
* [[Netwire]] |
* [[Netwire]] |
||
* [http://conal.net/fran/ Fran] (discontinued) |
* [http://conal.net/fran/ Fran] (discontinued) |
||
− | * [http://hackage.haskell.org/packages/archive/pkg-list.html#cat: |
+ | * [http://hackage.haskell.org/packages/archive/pkg-list.html#cat:FRP Hackage packages in the category FRP] |
− | |||
== Publications and talks == |
== Publications and talks == |
||
+ | |||
+ | * [https://www.youtube.com/watch?v=zgNRM8tZguY ICFP 2014: Settable and Non-Interfering Signal Functions for FRP - Daniel Winograd-Cort] (video) |
||
* [http://www.cs.rit.edu/~eca7215/frp-independent-study/Survey.pdf A Survey of Functional Reactive Programming] |
* [http://www.cs.rit.edu/~eca7215/frp-independent-study/Survey.pdf A Survey of Functional Reactive Programming] |
||
* [http://conal.net/papers/frp.html Conal Elliott’s FRP-related publications] |
* [http://conal.net/papers/frp.html Conal Elliott’s FRP-related publications] |
||
Line 67: | Line 71: | ||
* [http://haskell.cs.yale.edu/?page_id=65#FunctionalReactiveProgramming The Yale Haskell Group’s FRP-related publications] |
* [http://haskell.cs.yale.edu/?page_id=65#FunctionalReactiveProgramming The Yale Haskell Group’s FRP-related publications] |
||
+ | == Books == |
||
+ | * Blackheath, Stephen; Jones, Antony. [http://www.manning.com/blackheath Functional Reactive Programming]. Manning Publications (2015). p.245. ISBN 978-1-6334-3010-5 |
||
== Blog posts == |
== Blog posts == |
||
+ | |||
+ | * [http://blog.reactiveprogramming.org/ Functional Reactive Programming, a better way to build interactive applications] (about the Sodium FRP Library currently for C#, C++, Haskell and Java and more to come) |
||
* [http://apfelmus.nfshost.com/blog.html#functional-reactive-programming-frp FRP-related posts on Heinrich Apfelmus’ blog] |
* [http://apfelmus.nfshost.com/blog.html#functional-reactive-programming-frp FRP-related posts on Heinrich Apfelmus’ blog] |
||
* [http://conal.net/blog/tag/frp FRP-related posts on Conal Elliott’s blog] |
* [http://conal.net/blog/tag/frp FRP-related posts on Conal Elliott’s blog] |
||
Line 74: | Line 82: | ||
* [http://lukepalmer.wordpress.com/2008/11/28/relative-time-frp/ Relative time FRP] by Luke Palmer |
* [http://lukepalmer.wordpress.com/2008/11/28/relative-time-frp/ Relative time FRP] by Luke Palmer |
||
* [http://blog.edwardamsden.com/2011/03/demonstrating-time-leak-in-arrowized.html Demonstrating a Time Leak in Arrowized FRP] by Edward Amsden |
* [http://blog.edwardamsden.com/2011/03/demonstrating-time-leak-in-arrowized.html Demonstrating a Time Leak in Arrowized FRP] by Edward Amsden |
||
− | |||
== People == |
== People == |
||
Line 87: | Line 94: | ||
* [http://www.cs.nott.ac.uk/~nhn/ Henrik Nilsson] |
* [http://www.cs.nott.ac.uk/~nhn/ Henrik Nilsson] |
||
* [http://mcis.western.edu/~jpeterson/ John Peterson] |
* [http://mcis.western.edu/~jpeterson/ John Peterson] |
||
+ | * Ertugrul Söylemez |
||
[[Category:FRP|*]] |
[[Category:FRP|*]] |
Revision as of 11:45, 17 January 2015
Functional Reactive Programming (FRP) integrates time flow and compositional events into functional programming. This provides an elegant way to express computation in domains such as interactive animations, robotics, computer vision, user interfaces, and simulation.
Introduction
The original formulation of Functional Reactive Programming can be found in the ICFP 97 paper Functional Reactive Animation by Conal Elliott and Paul Hudak.
Behaviors
Traditionally a widget-based user interface is created by a series of imperative actions. First an action is invoked to create an edit widget, then additional actions can be invoked to read its current content, set it to a specific value or to assign an event callback for when the content changes. This is tedious and error-prone.
A better way to represent an edit widget's content is a time-varying value, called a behavior. The basic idea is that a time-varying value can be represented as a function of time:
newtype Behavior a =
Behavior {
at :: Time -> a
}
myName :: Behavior Text
myName `at` yesterday
This is only a theoretical model, because a time-varying value can represent something impure like the content of an edit widget, the current value of a database entry as well as the system clock's current time. Using this model the current content of an edit widget would be a regular first class value:
myEditWidget :: Behavior Text
In most frameworks there is an applicative interface for behaviors, such that you can combine them easily:
liftA2 (<>) myEdit1 myEdit2
The result is a time-varying value that represents the concatenation of myEdit1
and myEdit2
. This could be the value of a third widget, a label, to display the concatenation. The following is a hypothetical example:
do edit1 <- editWidget
edit2 <- editWidget
label <- label (liftA2 (<>) edit1 edit2)
{- ... -}
Without behaviors you would have to write event callback actions for the edit widgets to update the label's content. With behaviors you can express this relationship declaratively.
Events
To do
Libraries
- Sodium
- Grapefruit
- Reactive
- DataDriven
- Yampa
- wxFruit
- Elerea
- reactive-banana
- Netwire
- Fran (discontinued)
- Hackage packages in the category FRP
Publications and talks
- ICFP 2014: Settable and Non-Interfering Signal Functions for FRP - Daniel Winograd-Cort (video)
- A Survey of Functional Reactive Programming
- Conal Elliott’s FRP-related publications
- Grapefruit-related publications and talks
- The Yale Haskell Group’s FRP-related publications
Books
- Blackheath, Stephen; Jones, Antony. Functional Reactive Programming. Manning Publications (2015). p.245. ISBN 978-1-6334-3010-5
Blog posts
- Functional Reactive Programming, a better way to build interactive applications (about the Sodium FRP Library currently for C#, C++, Haskell and Java and more to come)
- FRP-related posts on Heinrich Apfelmus’ blog
- FRP-related posts on Conal Elliott’s blog
- FRP-related posts on Wolfgang Jeltsch’s blog
- Relative time FRP by Luke Palmer
- Demonstrating a Time Leak in Arrowized FRP by Edward Amsden
People
- Heinrich Apfelmus
- Antony Courtney
- Conal Elliott
- Patai Gergely
- Andy Gill
- Liwen Huang
- Paul Hudak
- Wolfgang Jeltsch
- Henrik Nilsson
- John Peterson
- Ertugrul Söylemez