函数式反应式编程

函数式反应式编程(FRP) 是一种采用函数式编程的基础部件（如 map、reduce、filter 等）进行反应式编程（异步数据流编程）的编程范式。FRP 被用于GUI、机器人和音乐方面的编程，旨在通过明确时间模型来简化这些问题。

FRP 的形式

自 1997 年 FRP 被提出以来，它产生了多种形式。其中一条多样性的坐标轴是语义从离散到连续。 另一条轴是FRP 系统可以如何被动态地更改。

离散

如事件驱动FRP 和 Elm 0.17 版本之前的形式那样，它们要求更新过程是离散的，且由事件驱动。 这些形式在FRP 的实践中被加以推崇，它们专注于拥有简单API 的语义，可以在如机器人学或Web 浏览器中被高效地实现。
在这些形式下，行为和事件的概念通常会被组合成总是拥有当前值的信号，但是它会被离散地改变。

实现问题

存在两种类型的FRP 系统，基于推送的和基于拉取的。基于推送的系统接收事件并将它们推过一个信号网络来达到某种结果。基于拉取的系统会等待结果请求，并逆向通过该网络来取回请求的结果。
某些FRP 系统例如Yampa 使用采样。在一个定期内，采样被推过一个信号网络。这种方法有两个缺点：在一个定期内处理样本的计算量会非常大，而且网络必须在等待采样区间的间隔时找出输入的更改。采样就是个基于推送的FRP 示例。
Hackage 上的Reactive 和 Etage 库介绍了一种叫做“推送-拉取FRP” 的方式，它将基于推送和基于拉取的FRP 最好的部分结合在了一起。按照这种方式，只有在定义纯粹的流上（如一系列时间固定的事件）的下一个事件被请求时，才会构造该事件。这些定义纯粹的流的行为类似于Haskell 中的惰性列表。此为基于拉取的部分。基于推送的部分会在系统外部的事件被带入系统中时才会使用。外部的事件会被推送给消费者，这样它们就可以在它发布的瞬间找到该事件。