推拉式和带箭头的FRP有什么根本的区别?

我想在Haskell学习FRP,但要决定使用哪个库是有点困难的。 许多似乎是死的企图,有些似乎已经复活(如最近在Yampa上的活动)。

据我所知,FRP有两种“种类”:一种是推拉式玻璃钢(如Reactive-banana),另一种是带箭头的玻璃钢(像Yampa)。 在Fran和FrTime的时代,似乎也有一些“经典的FRP”,但是我还没有发现任何近期的活动。

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

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

  • 还是他们必须平行演进,以达到不同的目的?

  • 我是否命名了每个类别中最重要的图书馆,还是有其他的select需要考虑(钠,Netwire等)?


我终于看到了J. Abrahamson在评论中推荐的Evan Czaplicki的演讲 。 这是非常有趣的,并帮助澄清我的事情。 我强烈推荐给任何发现这个问题有趣的人。

我到Haskell.org去调查你的问题我发现了两篇重要的文章,你应该阅读这些文章来进一步研究,我正在从这些学术论文中回答你的问题。

Conal Elliott推拉玻璃钢

通过约翰·休斯(John Hughes)将Monad推向箭头


  1. 是的,但也没有。 根据Elliot的说法, 推动数据驱动的FRP评估和拉动涉及到所谓的“需求”驱动的评估。 作者推荐拉,因为在数据input之间,推送往往是空闲的。 关键在于: 推拉结合并平衡了这些行为,以最大限度地减less重新计算价值的需求。 这很简单; 使用推拉操作玻璃钢会加速反应的能力。 箭头是使用抽象types链接值并同时对其进行评估的另一种技术。 所有这些概念都有根本的不同。 但是不要听我的话:

    箭头界面的性质对于最小化重新评估的目标是有问题的。 input事件和行为被组合成一个单一的input,然后随着任何组件的改变而改变(Elliott)。

    因此,箭与推拉的目标相矛盾。 这并不意味着你不能一次使用所有这些,只是它会很复杂,而且有一些东西,如果没有抽象的箭头types,就不能计算。

  2. 对于哪种方法是“未来之路”,我还没有find什么学术上的意见。 只要注意箭头可以很好地处理同时性。 如果你能够实现箭头并使用推挽来最小化计算,那将是未来的方式。

  3. 是的,他们处理不同的目的。 正如我所说,它们可以一起制定,但实施起来很难,即使它起作用,也可能否定推拉的反应速度的好处。

  4. 这是主观的,但Reactive和Yampa似乎是FRP最常用的语言库。 我想说康巴尔·埃利奥特的“react native”有着深厚的根基,而“扬帕”也是如此。 像Netwire这样的其他项目已经成为替代品,但是在它们取代巨人之前可能还需要一段时间。


希望这可以帮助! 就像我说的阅读我指出的文章会给你一个更好的箭头之间的语义距离,推拉。

Interesting Posts