14

我想知道反应式编程是如何与函数式编程联系在一起的。

大多数论文将“反应式编程”称为“功能反应式编程”。

反应式编程可以在函数式编程之外实现吗?

用函数式语言编写反应式程序更容易吗?

4

5 回答 5

12

我使用我称之为反应式编程或SEDA(分阶段事件驱动架构)的东西,但我并没有在函数式​​编程方面使用太多。 http://www.slideshare.net/PeterLawrey/writing-and-testing-high-frequency-trading-engines-in-java

虽然在功能上编写反应式程序更容易,但通过使用函数式编程来编写它们以更快地执行并不容易。重用可变状态通常比一直创建新的不可变对象快 2-5 倍。因此,如果您使用响应式编程来提高性能,我不会使用函数式编程。

开发人员经常觉得他们必须使用多个线程或内核,因为它们就在那里。这就像说您需要使用 100% 的磁盘空间,或者您正在浪费它。

恕我直言,如果它提高了性能,你应该只增加多线程的复杂性,这是实现这种改进的最简单方法。在关于使并发更容易的讨论中经常忘记的是,最简单的解决方案是使用一个线程,并且,除非您已经证明您的解决方案比这更快,否则您并没有让我相信使用多个线程是有帮助的。

于 2013-11-08T13:54:57.970 回答
4

我猜你正在上 Odersky/Meijer/Kuhn 的反应式编程课程?然后您将在第一节中看到 Martin Odersky 的解释:他使用了字典中的一个非常广泛的描述,其中反应的意思是“对刺激迅速做出反应”。所以它是关于一个程序观察并等待它响应的一些刺激。

所以从这个角度来看,反应首先是某种观察触发的功能。当您可以组合它们时,例如您映射事件或数据流变量,您可能会称其为“函数式”,因为一组未来值被声明为事件起源值的函数。

另一方面,函数式反应式编程或 FRP 是 Conal Elliott 和 Paul Hudak 创造的一个术语(最初:Functional Reactive Animation,因为它指的是图形界面)。它与他们的工作和 Haskell 编程语言密切相关。

许多实现反应式想法的库(例如,参见关于反应式编程的 WP 文章)与 FRP 共享事件组合方面,但它们不一定扩展到补充事件的 FRP 的分析/连续信号或“行为”。


您会发现有些人声称不遵守规范 FRP 的响应式编程(例如,在使用演员或频道时)正在从该标题的“真正持有者”中“窃取”该术语。所以这种讨论很容易变成意识形态。在意识形态的另一面,你会发现反应式经常(ab)被用作一个新的流行词。“反应性宣言”(宣言......真的!?你甚至可以签署那些东西......)可能就是这方面的一个例子。

于 2013-11-08T14:02:09.813 回答
2

对我来说,这个“反应式宣言”只是一个流行词。自 80 年代以来,Erlang 一直在免费且默默地实施整个事情。

我想说在函数式编程中遵循反应性原则更容易,因为 FP 通常包含不可变状态和免费的副作用函数。这意味着更容易实现并发、分布式并行系统。

祝你好运实现一个使用共享状态、线程、锁、信号量的“反应式”系统......而且你知道,他们说只有两个人可以正确地获得 Java 并发系统,Doug Lea 和 Brian Goetz。

于 2013-11-12T10:02:38.583 回答
0

您可能有兴趣查看Reactive Manifesto

我认为可以使用 OO 语言编写反应式应用程序(例如 Java 作为 NIO2 和 Netty Web 服务器),但使用函数式语言更合适。

于 2013-11-08T17:38:28.493 回答
0

不,它不是两者都是独立的编程范式,反应式是基于流的方法和基于纯函数哲学的函数式。

于 2017-12-08T18:55:21.693 回答