推拉式和箭头式FRP有何根本不同?


264

我想在Haskell学习FRP,但是要决定要使用的库有点困难。许多似乎是无用的尝试,有些似乎已经复活(例如最近在Yampa的活动)。

根据我的阅读,似乎有两种“种类”的FRP:一侧是推拉式FRP(例如在Reactive香蕉中),而在另一侧则是箭头式FRP(在Yampa中)。似乎在Fran和FrTime时也曾经有一些“经典FRP”,但是我没有发现这些中有任何近期活动。

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

  • 其中一个是过时的理论,而另一个将是“未来的东西”吗?

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

  • 我是否是每个类别中最杰出的图书馆,还是有其他选择要考虑(Sodium,Netwire等)?


我终于看了E. Czaplicki在J. Abrahamson评论中推荐的演讲。这非常有趣,确实为我澄清了一切。我强烈推荐给任何发现此问题有趣的人。


5
您可能对ertes(netwire作者)的观点感兴趣:stackoverflow.com/a/13344292/414413
Cirdec 2014年

14
很快:reactive-banana绝对是基于拉式而非推拉式。reactive是推挽式 Yampanetwire箭头化。有一些FRP允许“累计值”但不允许“切换”,而FRP却允许“切换”但不允许“累计值”。两者都是“简单的” FRP。箭头式FRP允许切换和累积,并使用箭头来控制组合这些功能的危险。一元FRP像reactive-bananasodium以及elerea使用其他小心机制,以确保开关和积累不相互影响太多。
J. Abrahamson

12
Arrowized FRP还具有简洁的功能,即始终在输入的上下文中声明信号,这使您可以协变地变换输出和输入地变换以更好地模拟交互式FRP。有关该功能的一个很好的示例,请参见Courtney和Elliott的正版功能用户界面。
J. Abrahamson

9
您可能还对Elm作者Evan Czaplicki 的演讲“控制时间和空间”感兴趣。在我看来,他设法对FRP设计空间以及所涉及的折衷做出了很好的概括。
DanielM 2014年

3
我想你会得到你的答案在这里.. stackoverflow.com/questions/10000074/...
Rushabh沙阿

Answers:


17

我前往Haskell.org进行了调查,以调查您的问题。我发现您应该阅读两篇重要的论文以进一步进行研究,并且我将从这些学术论文中为您的问题建立答案。

Conal Elliott推拉式玻璃钢

John Hughes将Monads概括为箭


  1. 是的,但也没有。根据Elliot的说法,推式是数据驱动的FRP评估,而拉式则涉及所谓的“需求”驱动的评估。作者之所以推荐拉动是因为在数据输入之间,推动往往会闲置。关键是:推挽式组合并平衡了这些行为,其主要目的是将重新计算值的需求降至最低。这很简单; 通过推拉操作FRP可以增强反应能力。Arrow是使用抽象类型链接值并同时求值的另一种技术。所有这些概念都根本不同。但是请不要相信我:

    对于最小化重新评估的目标,Arrow界面的性质存在问题。输入事件和行为组合成一个输入,然后在任何组件更改时都会更改(Elliott)。

    因此,Arrow与推挽的目标相矛盾。这并不意味着您不能一次使用所有这些功能,只是那会很复杂,并且有些内容如果没有抽象Arrow类型就无法计算。

  2. 我还没有找到关于哪种方法是“未来之路”的学术观点。仅注意箭头可以很好地处理同时性。如果您可以实现箭头并使用推挽式最小化计算,那将是未来的方式。

  3. 是的,它们有不同的目的。就像我说的那样,它们可以一起制定,但是很难实现,即使它确实起作用,也可能抵消推挽的无功速度优势。

  4. 这是主观的,但是Reactive和Yampa似乎是FRP最常引用的语言库。我想说的是Conal Elliott的Reactive根深蒂固,Yampa也成立了。其他项目,例如Netwire,是作为替代品出现的,但要取代巨头,可能还需要一段时间。


希望这可以帮助!就像我说的,阅读我指出的文章可以使您更好地理解箭头,推拉之间的语义距离。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.