Perhaps the most defining characteristic of classical FRP is the use of continuous time.
This means that FRP assumes that signals are changing all the time, even if their value is still the same, leading to needless recomputation. For example, the mouse position signal will trigger updates to the application dependency graph—like the one we saw previously for the mean program—even when the mouse is stationary.
Another problem is that classical FRP is synchronous by default: events are processed in order, one at a time. Harmless at first, this can cause delays, which would render an application unresponsive should an event take substantially longer to process.
Paul Hudak and others furthered research on higher-order FRP[7][8] to address these issues, but that came at the cost of expressivity.
The other formulations of FRP aim to overcome these implementation challenges.
Throughout the rest of this chapter, I'll be using the terms signals and behaviors interchangeably.