我想在Haskell中学习FRP,但要确定要使用的库有点困难。 许多似乎是死亡的尝试,有些似乎已经复活(例如最近在Yampa的活动)。
从我读到的,似乎有两种"种类" FRP:推拉式FRP(如Reactive-banana),另一侧是箭头型FRP(如Yampa)。似乎还有一些经典的FRP"在Fran和FrTime的时候,但是我没有发现这些最近的活动。
这两个(或三个)FRP真的是根本不同的方法吗?
其中一个是过时的理论,而另一个是未来的东西"?
或者它们是否必须并行发展,以达到不同的目的?
我是否列出了每个类别中最突出的图书馆,还是有其他选项需要考虑(Sodium,Netwire等)?
<子> 我终于看到了J. Abrahamson在评论中推荐的talk from Evan Czaplicki。这非常有趣,并帮助我澄清了一些事情。我强烈推荐给发现这个问题的人。 子>
答案 0 :(得分:16)
我前往Haskell.org调查你的问题我发现的是你应该阅读的两篇重要文章,以便进一步研究,我正在从这些学术论文中回答你的问题。
Push-Pull FRP by Conal Elliott
Generalising Monads to Arrows by John Hughes
是的,但也没有。根据Elliot的说法,推送是数据驱动的FRP评估,拉与所谓的&#34;需求&#34;驱动评估。作者建议拉,因为推送往往在数据输入之间空闲。这就是关键所在: push-pull 结合并平衡这些行为的主要目的是最大限度地减少重新计算价值的需要。这很简单;通过推拉操作FRP加快了反应能力。 箭头是一种使用抽象类型链接值并同时评估它们的不同技术。所有这些概念都根本不同。但是不要接受我的话:
因此,Arrow与推拉的目标相矛盾。这并不意味着你不能同时使用所有这些,只是它会很复杂,而且如果没有抽象箭头类型,有些东西你无法计算。Arrow界面的性质对于最小化重新评估的目标是有问题的。输入事件和行为被合并到一个输入中,然后在任何组件发生变化时会发生变化(Elliott)。
我没有找到关于哪种方法是未来之路的学术观点。&#34;只注意箭头可以特别好地处理同时性。如果你可以实现箭头并使用push-pull来最小化计算,那将是未来的方式。
是的,它们涉及不同的目的。正如我所说,它们可以配制在一起,但很难实现,即使它确实有效,也可能会抵消推拉的反应速度优势。
这是主观的,但Reactive和Yampa似乎是FRP最常被引用的语言库。我会说Conal Elliott的Reactive有很深的根源,Yampa也是如此。像Netwire这样的其他项目也是替代品,但在取代巨头之前可能需要一段时间。
希望这有帮助!就像我说的那样,阅读我指出的文章会让你更好地理解箭头,推拉之间的语义距离。