我想在Haskell学习FRP,但要决定要使用的库有点困难。
许多似乎是无用的尝试,有些似乎已经复活(例如最近在Yampa的 Activity )。
从我阅读的内容来看,似乎有两种“种类”的FRP:一侧是推拉式FRP(例如在Reactive-banana和Reflex中),而在另一侧则是箭头式FRP(在Yampa中)。似乎在Fran和FrTime时也曾经有一些“经典FRP”,但是我没有发现这些中有任何近期 Activity 。

  • 这两个(或三个)是FRP真正根本不同的方法吗?
  • 其中一个是过时的理论,而另一个将是“ future 的东西”吗?
  • 还是它们必须并行发展以解决不同的目的?
  • 我是否命名了每个类别中最著名的库,或者还有其他选择要考虑(Sodium,Netwire等)?

  • 我终于看了[J. Abrahamson的评论中推荐的[Evan Czaplicki的谈话](https://www.youtube.com/watch?v=Agu6jipKfYw)。这非常有趣,确实为我澄清了一切。我强烈推荐给任何发现此问题有趣的人。

    最佳答案

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

    Push-Pull FRP by Conal Elliott

    Generalising Monads to Arrows by John Hughes

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



    因此,Arrow与推挽的目标相矛盾。这并不意味着您不能一次使用所有这些功能,只是那会很复杂,并且有些内容如果没有抽象Arrow类型就无法计算。
  • 我尚未找到关于哪种方法是“ future 之路”的学术观点。仅注意,箭头可以很好地处理同时性。如果您可以实现箭头并使用推挽来最小化计算,那将是 future 的方式。
  • 是的,它们分别解决不同的目的。正如我所说,它们可以一起制定,但是很难实现,即使它确实起作用,也可能会否定推挽的无功速度优势。
  • 这是主观的,但是Reactive和Yampa似乎是FRP最常引用的语言库。我想说的是Conal Elliott的Reactive根深蒂固,Yampa也成立了。 Netwire等其他项目是作为替代项目出现的,但要取代巨头,可能还需要一段时间。


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

    关于haskell - 推拉式和箭头式FRP的根本区别是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26164135/

    10-10 00:33