功能反应式编程语言规范

Specification for a Functional Reactive Programming language

我正在考虑在某个时候创建一个功能性的反应式框架。我读了很多关于它的文章,并看到了一些例子,但是我想清楚这个框架要被视为一个FRP扩展/DSL需要做什么。我并不真正关心实现问题或细节等,而是更关心在一个完美的世界环境中需要什么。

理想的功能性反应式编程语言的关键操作和特性是什么?


我很高兴您从询问规范开始,而不是先询问实现。关于玻璃钢是什么有很多想法。对我来说,这总是两件事:(a)表示性的和(b)暂时连续的。许多人放弃了这两个属性,并用不同的实现概念来标识FRP,在我看来,所有这些都是离题的。为了减少混淆,我想看到Jake McArthur在去年的一次谈话中提出的术语"功能性反应式编程"被更准确和更具描述性的"表示性连续时间编程"(DCTP)所取代。

"表示性"是指建立在精确、简单、与实现无关的复合语义之上,该语义精确地指定了每种类型和构建基块的含义。然后,语义的组合性质决定了构建基块的所有类型正确组合的含义。对我来说,外延是函数编程的核心和本质,是精确和易处理推理的基础,是正确性、推导性和最优化的基础。彼得·兰丁建议用"泛指性"作为模糊术语"功能性"的实质性替代,并用一种方法来区分深层/真正的功能性编程和仅仅是功能性的符号。请参阅此评论了解一些Landin引号和纸张参考。

关于连续时间,请看《为什么要连续时间》节目?我在这一页的阿什利夫回答中引用的话。考虑到计算机的离散性,我听到"连续时间"的概念不知何故是不自然的或不可能实现的,对此我感到非常惊讶。这种思维方式让我觉得很奇怪,尤其是来自哈斯凯勒的时候,有几个原因:

  • 我们使用懒惰的函数语言,在有限的机器上随意地用无限的数据编程。因此,我们得到了可爱的模块化,如John Hughes的经典论文《为什么函数式编程很重要》所示。
  • 在连续空间中有许多编程的例子,例如矢量图形,也有类似pan的东西。
  • 我喜欢我的程序来反映我对问题空间的看法,而不是执行程序的机器,我倾向于期望其他高级语言程序员也能分享这种偏好。(当程序需要注意不相关的内容时,编程语言是低级的。)

自从tbag和activevrml(第一个dctp/frp系统)以及后来的fran以来,我一直在编写连续时间的编程库。很容易正确实施。本文介绍了连续建模动画的功能实现方法。有效地实现连续时间(而且仍然正确!)是另一回事,尤其是避免重新计算不变的值。(请参阅纸张推拉功能反应式编程。)

有关说明,请参阅我对反应式编程和功能性反应式编程之间的区别以及什么是(功能性)反应式编程的回答。更新:有关为什么连续时间很重要的更多信息,请参阅这些注释。最新消息:另见,我的2015年的演讲《玻璃钢的本质和起源》(以及相关的演讲)。

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


我想你可能看过马蒂亚斯·费雷森关于功能I/O的演讲,并读过他的论文。我认为他的方法很务实,很漂亮。希望你也偶然发现了科纳尔·埃利奥特的一些优秀作品。

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

我的另一个主要特性是历史调试程序。保持world状态的历史并能够在任何时间点进行重播,这应该是相对微不足道的。

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

I like denotative/functional
approaches, for composability &
semantic clarity. For the same
reasons, I prefer continuous time &
space over discrete time & space. In
all of these cases, the less
machine-like formulation nicely
separates the what from the how of its
machine-based presentation.

解决这个问题,你就会成为英雄!