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