【问题标题】:What's the difference between Behavior and Event in FRP?FRP 中的 Behavior 和 Event 有什么区别?
【发布时间】:2021-05-22 01:13:27
【问题描述】:

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

函数响应式编程 (FRP) 通常为事件流提供 Event 类型,为时变值提供 Behavior 类型,并提供有用的组合器。

...

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

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

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

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

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

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

--

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。尽管在这种特殊情况下,我仍然想更详细地了解一下,WebSharper 团队想在这里说什么?如果事件是离散的,那么无法进行实时采样怎么会阻碍呢? “事件流”指的是什么?如果我使用他们的实现与其他人相比,我会错过什么?知道理论上的差异,我仍然无法破译他们的帖子,不幸的是......
    • 我认为他们所说的是他们没有明确区分这两种。但我不熟悉 WebSharper,所以我不确定。对不起!
    • 其实我想我在这里找到了解释:stackoverflow.com/questions/22989253/… 似乎有两件事。 1. 事件流允许累积更新,而行为只能取决于观察到的元素的当前值。 2.如果事件和行为都实现了,它们允许在系统内递归。
    • 顺便问一下,如果您不使用 WebSharper,我可以知道您通常使用 F# 进行 Web 开发吗?一些更基础的框架/构建块?
    • @TomasPetricek 我自己实现了一个 FRP 库,reactive-banana,我会说行为也可以作为实用的想法很好地工作。 :-) 请注意,它们的效用与它们是否可以连续变化或仅在离散时间步长上变化无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2021-04-03
    • 2019-05-09
    相关资源
    最近更新 更多