推拉式和箭头式FRP在本质上有多大的不同?

269

我想学习Haskell中的FRP,但是很难决定要使用哪个库。 许多似乎是失败的尝试,有些似乎已经复活(例如Yampa上的最近活动)。

从我所读的内容来看,似乎有两种“类型”的FRP:推拉式FRP(像在Reactive-banana和Reflex中)和箭头化FRP(像在Yampa中)。在Fran和FrTime时代似乎也曾经有一些“经典FRP”,但我没有注意到这方面的任何最新活动。

  • 这两种(或三种)FRP方法真的是根本不同的方法吗?

  • 其中一种方法是否已过时,而另一种则是“未来的东西”?

  • 还是它们必须并行发展,以解决不同的目的?

  • 我是否提到了每个类别中最重要的库,还是需要考虑其他选项(如Sodium,Netwire等)?


我终于观看了J. Abrahamson在评论中推荐的Evan Czaplicki的演讲。它非常有趣,并帮助我澄清了一些问题。我强烈建议任何对此问题感兴趣的人观看它。

5
你可能会对ertes(netwire的作者)的看法感兴趣:https://dev59.com/qWYr5IYBdhLWcg3w29vi#13344292 - Cirdec
15
很快地说,reactive-banana 明确是拉取式的而不是推送-拉取式的。reactive 是推送-拉取式的。Yampanetwire 是箭化的。有一些 FRP 允许“累积值”,但不允许“切换”,还有一些 FRP 允许“切换”但不允许“累积值”。这两者都是“简单” FRP。箭化的 FRP 允许切换和累积,并使用箭头来控制这些特性组合的危险性。类似于 reactive-bananasodiumelerea 的单子化 FRP 使用其他谨慎的机制来确保切换和累积之间不会产生太多交互。 - J. Abrahamson
12
箭头化FRP还有一个很不错的特性,就是信号总是在其输入的上下文中说明,这使得您可以将输出进行协变转换和输入进行逆变转换,以更好地模拟交互式FRP。请参考Courtney和Elliott的《真正的功能用户界面》一书,了解这个特性的一个很好的例子。 - J. Abrahamson
9
您可能对 Elm 作者 Evan Czaplicki 的演讲《控制时间和空间》("Controlling Time and Space")感兴趣。在我看来,他成功地给出了 FRP 设计空间和所涉及的折衷方面的高层概述。请点击链接观看演讲视频。 - DanielM
3
我认为你会在这里找到答案:https://dev59.com/8mkw5IYBdhLWcg3wSoks - Rushabh Shah
显示剩余7条评论
1个回答

23

我访问了Haskell.org以调查您的问题,找到了两篇重要的论文,建议您阅读以进一步研究,本答案是基于这些学术论文构建的。

Push-Pull FRP by Conal Elliott

Generalising Monads to Arrows by John Hughes


  1. 是的,但也不完全是。根据Elliott的说法,push是数据驱动的FRP评估方式,而pull则涉及所谓的“需求”驱动的评估方式。作者推荐使用pull,因为push倾向于在数据输入之间闲置。关键在于:push-pull结合和平衡这些行为,主要目的是最小化重新计算值的需要。很简单;使用push-pull操作FRP可以加快反应能力。 Arrow是一种不同的使用抽象类型将值链接并同时评估它们的技术。所有这些概念都是根本不同的。但不要相信我的话:

    Arrow接口的性质对于最小重新评估的目标是有问题的。输入事件和行为被合并成单个输入,每当任何组件发生更改时,它就会改变(Elliott)。

    因此,Arrow与push-pull的目标相矛盾。这并不意味着您不能同时使用它们,只是这样做将会很复杂,并且有些东西不能使用抽象的Arrow类型计算。

  2. 我没有找到哪种方法是“未来的方向”的学术观点。仅注意到箭头可以特别好地处理同时性。如果您能实现箭头并使用push-pull来最小化计算,则会成为未来的方向。

  • 是的,它们解决不同的问题。就像我说的,它们可以一起使用,但很难实现,即使它能够工作,也可能会抵消推拉的反应速度优势。

  • 这是主观的,但Reactive和Yampa似乎是FRP最常被引用的语言库。我会说由Conal Elliott开发的Reactive有深厚的根基,而Yampa也已经成熟。其他项目如Netwire出现作为替代品,但可能需要一段时间才能取代这些巨头。


  • 希望这可以帮到您!就像我说的,阅读我指出的文章将让您更好地了解箭头、推和拉之间的语义距离。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接