268

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

根据我的阅读,似乎有两种“类型”的 FRP:一侧是推拉式 FRP(如 Reactive-banana 和 Reflex 中),另一侧是箭头化 FRP(如 Yampa 中)。似乎在 Fran 和 FrTime 时代也曾经有过一些“经典 FRP”,但我没有发现这些最近的活动。

  • 这两种(或三种)真的是完全不同的 FRP 方法吗?

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

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

  • 我是否命名了每个类别中最突出的库,或者是否有其他选择需要考虑(Sodium、Netwire 等)?


我终于看了 J. Abrahamson 在评论中推荐的 [来自 Evan Czaplicki 的谈话](https://www.youtube.com/watch?v=Agu6jipKfYw)。这很有趣,并且确实帮助我澄清了一些事情。我强烈推荐给任何觉得这个问题很有趣的人。
4

1 回答 1

21

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

Conal Elliott的推拉玻璃钢

John Hughes 将 Monads 推广到 Arrows


  1. 是的,但也不是。根据 Elliot 的说法,push是数据驱动的 FRP 评估,而pull与所谓的“需求”驱动评估有关。作者推荐使用 pull,因为 push 在数据输入之间往往会闲置。关键在于:push-pull结合并平衡了这些行为,其主要目的是最大限度地减少重新计算值的需要。这很简单; 以推拉方式操作 FRP 可加快反应能力。Arrow是一种使用抽象类型来链接值并同时评估它们的不同技术。所有这些概念都是根本不同的。但不要相信我的话:

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

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

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

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

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


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

于 2015-06-20T22:29:28.470 回答