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