Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can functional reactive programming (FRP) be expressed using monads?

I've been reading up on Functional Reactive Programming, and though I have not used monads extensively in any language, I can't help but see them everywhere in the FRP design.

This question's answers have some fantastic descriptions of what functional reactive programming is, and I won't attempt to replicate that here. Basically, FRP creates relationships between values that change over time.

So can't this be represented monadically? Encapsulate the code that requires the values that are modified over time in a monad, call it Signal, then use those signals like so (using Haskell do-notation for simplicity).

do
  mx <- mouseX
  my <- mouseY
  wave <- currentTime >>= liftM sin
  -- do some stuff with these values

Or is there more to FRP than I'm understanding? Are there paradigms that prevent using such a simple representation using monads? Or is this a valid (if perhaps simplified) understanding of how FRP works?

like image 245
Alexis King Avatar asked Feb 03 '15 07:02

Alexis King


People also ask

What are monads in functional programming?

In functional programming, a monad is a software design pattern with a structure that combines program fragments (functions) and wraps their return values in a type with additional computation.

Is reactive functional programming?

Functional reactive programming (FRP) is a programming paradigm for reactive programming (asynchronous dataflow programming) using the building blocks of functional programming (e.g. map, reduce, filter).

What is FRP computer science?

Functional reactive programming (FRP) is a programming framework that combines functional and reactive programming techniques to build applications, services and devices.

Why is reactive programming functional?

What is functional reactive programming (FRP)? FRP is the combination of functional and reactive paradigms. In other words, it is reacting to data streams using the functional paradigm. FRP is not a utility or a library — it changes the way you architect your applications and the way you think about your applications.


1 Answers

Behaviors could be given monad operations. After all Behavior a is semantically Time -> a, which is Reader Time.

Also Events which are semantically [(Time, a)] could be given at least Applicative instance which would resemble ZipList structure.

Yet, even these are theoretically possible and elegant, in practice they are hard to implement. You could check "Controlling Time and Space: understanding the many formulations of FRP" by Evan Czaplicki for more information.

For example sodium have kind of monadic bind for Behaviors:

switch :: Behavior (Behavior a) -> Reactive (Behavior a)

but instead of working in the pure category, we work in Kleisli category of Reactive monad. Thus we can do a bit more.

One exercise which highlights the difficulties, is to try to implement ArrowApply for Automaton. SO provided spoiler

like image 134
phadej Avatar answered Oct 11 '22 06:10

phadej