64

我正在考虑在某个时候创建​​一个功能性反应框架。我已经阅读了很多关于它的内容并看到了一些示例,但我想清楚地了解这个框架必须做什么才能被视为 FRP 扩展/dsl。我并不真正关心实施问题或细节等,而是更关心在完美世界情况下需要什么。

理想的函数式反应式编程语言的关键操作和品质是什么?

4

3 回答 3

123

我很高兴您首先询问规范而不是实施。关于 FRP 是什么,有很多想法。从 90 年代初期开始(当我在 Sun Microsystems 和 Microsoft Research 从事交互式图形工作时),它一直具有两个属性(a)表示性和(b)时间连续性。许多人放弃了这两个属性,并用各种实现概念来识别 FRP,在我看来,所有这些都是无关紧要的。为了减少混淆,我希望看到术语“函数式反应式编程”被更准确和描述性的“指示性、连续时间编程”(DCTP)取代,正如 Jake McArthur 在去年的一次谈话中所建议的那样。

通过“外延”,我的意思是建立在精确、简单、独立于实现的组合语义之上,该语义准确地指定了每种类型和构建块的含义。然后,语义的组合性质决定了构建块的所有类型正确组合的含义。对我来说,外延是函数式编程的核心和本质,是实现精确和易于推理的原因,因此是正确性、推导和优化的基础。Peter Landin 建议将“外延”作为模糊术语“函数式”的实质性替代,以及一种将深度/真正函数式编程与仅仅具有函数式外观的符号区分开来的方法。有关 Landin 的一些引述和论文参考,请参阅此评论

关于连续时间,请参阅帖子为什么要使用连续时间进行编程?以及我在此页面上 AshleyF 的回答中的引述。考虑到计算机的离散性,听到连续时间的想法在某种程度上不自然或不可能实现的说法,我一次又一次地感到惊讶。这种思路让我觉得很奇怪,尤其是来自 Haskellers 时,原因如下:

  • 使用惰性函数式语言,我们随意地在有限机器上用无限数据进行编程。结果,我们得到了可爱的模块化,正如 John Hughes 的经典论文Why Functional Programming Matters中所说明的那样。
  • 在连续空间中编程的例子有很多,例如矢量图形,还有Pan之类的东西。
  • 我喜欢我的程序反映我对问题空间的看法,而不是对执行程序的机器的看法,我倾向于期望其他高级语言程序员也能分享这种偏好。(“当程序需要关注不相关的内容时,编程语言是低级的。” - Alan Perlis)

自TBAGActiveVRML(第一个 DCTP/FRP 系统)和后来的Fran以来,我一直在制作用于连续时间编程的库。很容易正确实施。连续建模动画的功能实现一文中描述了几种不同的方法。有效地实现连续时间(并且仍然正确!)是另一回事,尤其是避免重新计算不变的值。(请参阅论文推拉功能反应式编程。)

有关相关说明,请参阅我对响应式编程和功能响应式编程之间的区别什么是(功能)响应式编程? 更新:有关连续时间为何重要的更多信息,请参阅这些说明更新:另见,我的 2015 年演讲FRP 的本质和起源(以及链接在那里的相关演讲)。

祝您探索顺利,如果您有任何问题,请告诉我。我的联系信息在我的主页上

于 2011-05-04T04:25:14.613 回答
6

我假设您可能已经看过Matthias Felleisen关于函数式 I/O 的演讲并阅读了他的论文。我认为他是一个非常务实和美丽的方法。希望您也偶然发现了Conal Elliott的一些出色作品。

我个人的要求是系统是完全纯净的。也就是说,所有的行为都是由纯world->world函数定义的,所有的实现或可视化都是由world->visual函数定义的;其中是系统输出visual的一些静态描述。

我的另一个主要功能是历史调试器。维护world状态历史并能够从任何时间点重播应该是相对微不足道的。

一个非常有趣的研究领域(我相信一个未解决的问题)是使用连续时间,而不是world->world在一些离散的时钟滴答上迭代函数。我曾经在 FRP 上发表过几篇博文,Conal Elliott留下了以下发人深省的评论:

我喜欢指称/功能方法,以实现可组合性和语义清晰。出于同样的原因,我更喜欢连续的时间和空间而不是离散的时间和空间。在所有这些情况下,不太像机器的公式很好地将其基于机器的演示的内容与方式分开。

解决这个问题,您将成为英雄!

于 2011-05-04T01:26:30.923 回答
0
于 2021-09-03T05:56:45.160 回答