我正在考虑在某个时候创建一个功能性反应框架。我已经阅读了很多关于它的内容并看到了一些示例,但我想清楚地了解这个框架必须做什么才能被视为 FRP 扩展/dsl。我并不真正关心实施问题或细节等,而是更关心在完美世界情况下需要什么。
理想的函数式反应式编程语言的关键操作和品质是什么?
我正在考虑在某个时候创建一个功能性反应框架。我已经阅读了很多关于它的内容并看到了一些示例,但我想清楚地了解这个框架必须做什么才能被视为 FRP 扩展/dsl。我并不真正关心实施问题或细节等,而是更关心在完美世界情况下需要什么。
理想的函数式反应式编程语言的关键操作和品质是什么?
我很高兴您首先询问规范而不是实施。关于 FRP 是什么,有很多想法。从 90 年代初期开始(当我在 Sun Microsystems 和 Microsoft Research 从事交互式图形工作时),它一直具有两个属性(a)表示性和(b)时间连续性。许多人放弃了这两个属性,并用各种实现概念来识别 FRP,在我看来,所有这些都是无关紧要的。为了减少混淆,我希望看到术语“函数式反应式编程”被更准确和描述性的“指示性、连续时间编程”(DCTP)取代,正如 Jake McArthur 在去年的一次谈话中所建议的那样。
通过“外延”,我的意思是建立在精确、简单、独立于实现的组合语义之上,该语义准确地指定了每种类型和构建块的含义。然后,语义的组合性质决定了构建块的所有类型正确组合的含义。对我来说,外延是函数式编程的核心和本质,是实现精确和易于推理的原因,因此是正确性、推导和优化的基础。Peter Landin 建议将“外延”作为模糊术语“函数式”的实质性替代,以及一种将深度/真正函数式编程与仅仅具有函数式外观的符号区分开来的方法。有关 Landin 的一些引述和论文参考,请参阅此评论。
关于连续时间,请参阅帖子为什么要使用连续时间进行编程?以及我在此页面上 AshleyF 的回答中的引述。考虑到计算机的离散性,听到连续时间的想法在某种程度上不自然或不可能实现的说法,我一次又一次地感到惊讶。这种思路让我觉得很奇怪,尤其是来自 Haskellers 时,原因如下:
自TBAG和ActiveVRML(第一个 DCTP/FRP 系统)和后来的Fran以来,我一直在制作用于连续时间编程的库。很容易正确实施。连续建模动画的功能实现一文中描述了几种不同的方法。有效地实现连续时间(并且仍然正确!)是另一回事,尤其是避免重新计算不变的值。(请参阅论文推拉功能反应式编程。)
有关相关说明,请参阅我对响应式编程和功能响应式编程之间的区别和什么是(功能)响应式编程? 更新:有关连续时间为何重要的更多信息,请参阅这些说明。更新:另见,我的 2015 年演讲FRP 的本质和起源(以及链接在那里的相关演讲)。
祝您探索顺利,如果您有任何问题,请告诉我。我的联系信息在我的主页上。
我假设您可能已经看过Matthias Felleisen关于函数式 I/O 的演讲并阅读了他的论文。我认为他是一个非常务实和美丽的方法。希望您也偶然发现了Conal Elliott的一些出色作品。
我个人的要求是系统是完全纯净的。也就是说,所有的行为都是由纯world->world
函数定义的,所有的实现或可视化都是由world->visual
函数定义的;其中是系统输出visual
的一些静态描述。
我的另一个主要功能是历史调试器。维护world
状态历史并能够从任何时间点重播应该是相对微不足道的。
一个非常有趣的研究领域(我相信一个未解决的问题)是使用连续时间,而不是world->world
在一些离散的时钟滴答上迭代函数。我曾经在 FRP 上发表过几篇博文,Conal Elliott留下了以下发人深省的评论:
我喜欢指称/功能方法,以实现可组合性和语义清晰。出于同样的原因,我更喜欢连续的时间和空间而不是离散的时间和空间。在所有这些情况下,不太像机器的公式很好地将其基于机器的演示的内容与方式分开。
解决这个问题,您将成为英雄!