推拉和箭头化玻璃钢的根本区别如何?

Gui*_*nce 264 haskell frp yampa reactive-banana

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

根据我的阅读,似乎FRP有两种"种类":一侧是推拉式FRP(如Reactive-banana),另一侧是箭头式FRP(如Yampa).似乎在弗兰和弗里斯时代曾经有过一些"经典的FRP",但我没有发现其中的任何近期活动.

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

  • 其中一个是过时的理论而另一个是"未来的东西"?

  • 或者它们是否必须并行发展,以满足不同的目的?

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


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

Kev*_*gio 17

我前往Haskell.org调查你的问题我发现的是你应该阅读的两篇重要论文,以便进一步研究,我正在从这些学术论文中回答你的问题.

Conal Elliott的推拉式玻璃钢

John Hughes将Monads推向箭头


  1. 是的,但也没有.根据Elliot的说法,推动是数据驱动的FRP评估,拉动与所谓的"需求"驱动评估相关.作者建议拉,因为推送往往在数据输入之间空闲.这就是关键:推拉结合并平衡这些行为的主要目的是最大限度地减少重新计算价值的需要.这很简单; 通过推拉操作FRP加快了反应能力.Arrow是一种使用抽象类型链接值并同时评估它们的不同技术.所有这些概念都根本不同.但是不要相信我的话:

    Arrow界面的性质对于最小化重新评估的目标是有问题的.输入事件和行为被组合成单个输入,然后在任何组件发生变化时就会发生变化(Elliott).

    因此,箭与推拉的目标相矛盾.这并不意味着你不能同时使用所有这些,只是它会很复杂,并且有些东西如果没有抽象的箭头类型就无法计算.

  2. 我没有找到关于哪种方法是"未来之路"的学术观点.只注意箭头可以特别好地处理同时性.如果你可以实现箭头并使用push-pull来最小化计算,那将是未来的方式.

  3. 是的,它们涉及不同的目的.正如我所说,它们可以一起制定,但很难实现,即使它确实有效,也可能会抵消推拉的无效速度优势.

  4. 这是主观的,但Reactive和Yampa似乎是FRP最常被引用的语言库.我会说Conal Elliott的Reactive有很深的根源,Yampa也是如此.像Netwire这样的其他项目作为替代品出现了,但它们可能需要一段时间才能取代巨头.


希望这可以帮助!就像我说的那样,阅读我指出的文章会让你更好地理解箭头,推拉之间的语义距离.