繁体   English   中英

功能响应式编程语言规范

[英]Specification for a Functional Reactive Programming language

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM