FRP中行为和事件之间有什么区别?

时间:2016-09-10 09:17:11

标签: f# reactive-programming frp websharper websharper.ui.next

我目前正在阅读WebSharper的文档。在the section about FRP中,它声明:

  

功能反应式编程(FRP)通常为事件流提供事件类型,为时变值提供行为类型,以及有用的组合器。

     

...

     

但是,目前我们决定避免实施FRP。相反,我们专注于功能的子集,定义类似于行为的时变View值,但不支持实时采样。事件流留给用户使用回调或第三方库来解决。这是对FRP的极大简化,更容易有效实施。

     

随着JavaScirpt中的弱指针变得可用,这个决定可能会被修改,特别是考虑到OCaml React的成功。

     

在不久的将来,我们打算提供Concurrent ML组合器,以更好地支持处理事件流并改善组件的组成。

但是,我不确定这里描述的“事件类型”和“行为类型”之间究竟有什么区别。我用Google搜索了一些文章/教程,但他们似乎也没有这么明确。

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

对不起,如果这个问题听起来很重要。我不熟悉与FRP相关的概念。

-

编辑:我认为我在FRP - Event streams and Signals - what is lost in using just signals?处找到了对没有事件流的错误的答案。要点是:

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

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

1 个答案:

答案 0 :(得分:4)

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

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

  • 事件表示系统中的离散事件 - 它们偶尔发生并且可以触发某些更改,但并不总是有值。例如,鼠标点击可能会发生,但您无法询问"当前的点击值是什么。

这些理论思想非常好,因为你可以用行为和事件做不同的事情,并且很好地捕捉到反应系统中不同类型事物背后的一些直觉。

在实践中,实施起来相当棘手 - 大多数表现为"行为"最终使用采样,所以它们的行为很像离散事件(也许是因为计算机的工作原理?)因此一些系统实际上遵循原始的严格区分。