推挽型FRP和箭头型FRP有什么本质区别?

我想在Haskell学习FRP,但是决定使用哪个图书馆有点困难。 许多尝试似乎已经失败,有些似乎已经复活(比如最近在Yampa上的活动)

据我所知,似乎有两种“类型”。玻璃钢:一边是推拉玻璃钢(像在反应香蕉和反射),另一边是箭头玻璃钢(像在Yampa)。似乎过去也有一些“经典的FRP"在Fran和FrTime的时候,但我没有发现它们最近有任何活动。

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

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

  • 或者它们必须并行进化,以达到不同的目的?

  • 我是否命名了每个类别中最突出的库,或者是否考虑了其他选项(钠,Netwire等)?


我终于看了J. Abrahamson在评论中推荐的[Evan Czaplicki的演讲](https://www.youtube.com/watch?v=Agu6jipKfYw)。这很有趣,也帮我理清了一些事情。我强烈推荐给任何觉得这个问题有趣的人。
11452 次浏览

我访问了Haskell.org网站来调查你的问题。我发现了两篇重要的论文,你应该阅读这些论文来进一步研究,我正在从这些学术论文中构建我对你问题的答案。

Push-Pull FRP by Conal Elliott

将单子概括为箭头by John Hughes


  1. 是的,但也不是。根据Elliot的说法,是数据驱动的FRP评估,而与所谓的“需求”驱动的评估有关。作者推荐使用pull,因为push在数据输入之间倾向于空闲。这里是关键:推拉结合和平衡这些行为的主要目的是减少重新计算值的需要。。推拉式玻璃钢操作可以加快反应能力。箭头是一种不同的技术,用于使用抽象类型来链接值并同时计算它们。所有这些概念都是根本不同的。但不要相信我的话:

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

    因此,《绿箭》与“推-拉”的目标相矛盾。这并不意味着你不能一次使用所有这些,只是它会很复杂,有些东西没有抽象的箭头类型你就无法计算

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

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

  4. 这是主观的,但是Reactive和Yampa似乎是FRP最常被引用的语言库。我想说的是,Conal Elliott的《Reactive》有着深厚的根基,而Yampa也是如此。其他项目如Netwire作为替代品出现,但要取代巨头可能还需要一段时间。


希望这能有所帮助!就像我说的,阅读我指出的文章会让你更好地理解箭头、推和拉之间的语义距离。