我正在考虑在某些时候创建一个功能性反应框架。我已经阅读了很多关于它的内容,并看了几个例子,但我想清楚地知道这个框架必须做什么才能被认为是FRP扩展/ dsl。我并不是真正关心实施问题或具体细节等,而是关注在完美的世界环境中需要什么。
理想的功能反应式编程语言的关键操作和质量是什么?
答案 0 :(得分:112)
我很高兴你首先询问规范而不是先实现。 有关FRP的内容有很多想法。 对我来说,它始终是两件事:(a)外延和(b)暂时连续。 许多人放弃了这两个属性,并使用各种实现概念来识别FRP,所有这些都与我的观点不同。 为了减少混淆,我希望看到“功能反应式编程”一词被更准确的&描述性的“指示性,连续时间编程”(DCTP),正如Jake McArthur在a conversation last year中所建议的那样。
通过“外延”,我的意思是建立在一个精确的,简单的,与实现无关的组合语义上,它准确地指定了每种类型和构建块的含义。 然后,语义的组成性质决定了构建块的所有类型正确组合的含义。 对我来说,外延是心脏&函数式编程的本质,是实现精确&易于推理,因而是正确性,推导和优化的基础。 彼得兰丁推荐“外延”作为对“功能性”这个模糊术语的实质性替代,以及一种区分深度/真正功能性编程与仅仅是功能性符号的方法。 有关Landin引用和论文参考,请参阅this comment。
关于连续时间,请参阅此页面上的帖子Why program with continuous time?和AshleyF答案中的引用。 我对此感到惊讶考虑到计算机的离散性,认为连续时间的想法在某种程度上是不自然的或不可能实现的。 这种想法让我觉得奇怪,特别是来自Haskellers时,出于以下几个原因:
自从TBAG和ActiveVRML(第一个DCTP / FRP系统)以及后来的Fran以来,我一直在为编程创建库。 它很容易正确实现。 文章Functional Implementations of Continuous Modeled Animation中描述了一些不同的方法。 实现连续时间有效(并且仍然正确!)是另一回事,特别是避免重新计算不变的值。 (参见论文Push-pull functional reactive programming。)
有关相关说明,请参阅my answer to The difference between Reactive and Functional-Reactive programming和What is (functional) reactive programming? 更新:有关连续时间问题的更多信息,请参阅these notes。 更新:另请参阅我2015年的演讲The essence and origins of FRP(以及与之相关的相关演讲)。
祝你好运,如果您有任何疑问,请告诉我。 我的联系信息位于my home page。
答案 1 :(得分:5)
我假设您可能在功能I / O上看过Matthias Felleisen’s talk并阅读his paper。我认为他是一个非常务实和美好的方法。希望你也偶然发现Conal Elliott的一些优秀作品。
我的个人要求是系统完全纯净。也就是说,所有行为都由纯world->world
函数定义,所有实现或可视化都由world->visual
函数定义;其中visual
是来自系统的输出的静态描述。
我的另一个主要功能是历史调试器。保持world
州的历史并能够从任何时间点重播都应该是相对微不足道的。
一个非常有趣的研究领域(我相信一个未解决的问题)是使用连续时间而不是在某些离散时钟 ticks 上迭代world->world
函数。我曾经做过few blog posts on FRP和Conal Elliott留下以下发人深省的评论:
我喜欢外延/功能性 方法,可组合性和 语义清晰度。对于相同的 原因,我更喜欢连续时间和 离散时间和空间上的空间空间。在 所有这些情况,越少 机器般的配方很好 把它与它的方式区分开来 基于机器的演示。
解决这个问题,你将成为英雄!