通过示例,有人可以证明懒惰评估与反应式编程有何不同。或者,它们非常相似吗?
鉴于c = 3;
这两种方法似乎都涉及至少在内部实施b = c + 2;
,无论代码如何看作int b() {return c + 2;}
。在这两种情况下,不知道b
是什么,直到需要它的值,然后进行计算。
描述这种方法的名称是什么?
所以反应式编程使用或模拟惰性评估?具有惰性评估的语言是以反应方式编程的吗?
答案 0 :(得分:7)
您似乎将懒惰评估和反应式编程混淆为处于相同的逻辑级别。"
对我来说,懒惰评估是一种允许存在和操纵无限数据的语言工具。 (具有某种"有限结构的数据"但是在你可以随意拉出并且仍有一些遗留的意义上是无限的。)如果你刮了一下头并尝试了一些例如,你会发现,在存在无限数据结构的情况下,懒惰评估是好的,因为你不会永远地循环#34;使用这些值时。 (虽然懒惰评估还有其他用途,但有时肯定会有一些性能提升。)
维基百科定义了反应式编程:
在计算中,反应式编程是一种围绕数据流和变化传播的编程范例。这意味着应该可以在所使用的编程语言中轻松表达静态或动态数据流,并且底层执行模型将自动通过数据流传播更改。
对我而言,这根本不适合懒惰的评估。懒惰的评估意味着你只需要计算尽可能多的答案就可以做更多的工作,然后保留一个持有人(通常称为" thunk"),让你在需要时做更多的工作这样你就可以计算出更多答案。 (顺便说一句,这种能够根据你的需要推出"正是允许你使用懒惰评估来玩无限数据的能力。)
相比之下,反应式编程允许您 - 简洁地 - 定义数据流将如何传播。 (例如,一个反应式框架可以让你设置你给而没有显然必须使用回调和函数指针实现它的那个例子。)但实际上,这条线非常模糊。在命令式语言中肯定存在反应性框架:大多数人会将GUI框架称为反应式。
相比之下,在functional reactive programming(FRP)中,您声明性地指定了被动数据。这是在引擎盖下实施的#34;使用Haskell语言的懒惰(在特定情况下),因为这是最适合进行更新的方法(因为它最直接适合该范例)。
但是在像C或C ++这样的语言中,你通常会通过函数指针或回调来进行反应式编程,而没有明确的惰性求值概念。当然,可能会有一些懒惰来支持这种东西,但是你并没有真正处于正确的语义层面来做出这种区分,在这种情况下你通常可以使用懒惰的技巧和' #39;加速反应式框架(表面上更新了一些东西---说GUI - 随着用户使用更多部分而按需)。