FRP 中的 Behavior 和 Event 有什么区别?

What's the difference between Behavior and Event in FRP?

我目前正在阅读 WebSharper. In the section about FRP 的文档,它指出:

Functional Reactive Programming (FRP) typically provides an Event type for event streams and a Behavior type for time-varying values, together with useful combinators on those.

...

However, for now we decided to avoid implementing FRP. Instead, we focus on a subset of functionality, defining time-varying View values similar to Behaviors, but without support for real-time sampling. Event streams are left for the user to tackle using callbacks or third-party libraries. This is a vast simplification over FRP and is much easier to implement efficiently.

As weak pointers become available in JavaScirpt, this decision might be revised, especially in light of OCaml React success.

In the more immediate future, we intend to provide Concurrent ML combinators to better support dealing with event streams and improve composition of Components.

但是,我不确定这里描述的“事件类型”和“行为类型”之间到底有什么区别。我在谷歌上搜索了一些 articles/tutorials,但他们似乎也不是很明确。

我不确定在 WebSharper 的实现中没有“事件”我错过了什么。

抱歉,如果这个问题听起来很基础。我对FRP相关的概念不熟悉

--

编辑:我想我在 FRP - Event streams and Signals - what is lost in using just signals? 找到了我对没有事件流的问题的疑问的答案。要点是:

  1. 事件流允许累积更新,而行为只能取决于观察到的元素的当前值。

  2. 如果事件和行为都实现了,它们允许在系统内递归。

事件行为 之间的区别可以追溯到 Functional Reactive Animations (PDF) 上的第一篇论文,这很好地解释了区别。这个想法是:

  • 行为 表示随时间变化的值 - 例如,鼠标 X 坐标随时间变化,但它总是有一些值。

  • 事件 表示系统中的离散事件 - 它们时不时地发生并且可以触发一些变化,但并不总是具有价值。例如,鼠标点击可能发生,但你不能问“点击的当前值是多少”。

这些作为理论想法非常好,因为你可以用行为和事件做不同的事情,它们很好地捕捉了反应式系统中不同种类事物背后的一些直觉。

虽然在实践中,实现起来非常棘手 - 大多数“行为”的表示最终都使用采样,因此它们的行为很像离散事件(可能是因为这就是计算机的工作方式?)因此实际上只有少数系统按照原文严格区分。