Functional programming 函数式反应式编程语言规范

Functional programming 函数式反应式编程语言规范,functional-programming,programming-languages,semantics,frp,Functional Programming,Programming Languages,Semantics,Frp,我正在考虑在某个时候创建一个功能性的反应式框架。我已经读了很多关于它的书,看到了一些例子,但我想弄清楚这个框架需要做什么才能被视为FRP扩展/dsl。我不是真的关心实现问题或细节等,而是更关心在一个完美的世界环境中需要什么 理想的函数式反应式编程语言的关键操作和特性是什么?我想您可能已经看过函数式I/O和read。我认为他的方法非常务实和漂亮。希望你也偶然发现了一些作者的优秀作品 我个人的要求是这个系统是完全纯净的。也就是说,所有行为都由纯world->world函数定义,所有实现或可视化都由w

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


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

我想您可能已经看过函数式I/O和read。我认为他的方法非常务实和漂亮。希望你也偶然发现了一些作者的优秀作品

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

我的另一个主要功能是历史调试器。维护
世界
状态的历史记录并能够从任何时间点进行回放应该相对简单

一个非常有趣的研究领域(我相信这是一个尚未解决的问题)是使用连续时间,而不是在一些离散的时钟信号上迭代
world->world
函数。我曾经做过一次演讲,并留下了以下发人深省的评论:

我喜欢外延式/功能性的 方法,用于可组合性& 语义清晰。同样 原因,我更喜欢连续时间& 离散时间和空间上的空间。在里面 所有这些情况下,越少 机械式配方 将其内容的what与how分开 基于机器的演示


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

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

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

关于连续时间,请参阅本页AshleyF回答中的帖子和我的引用。 考虑到计算机的离散性,连续时间的概念在某种程度上是不自然的或不可能实现的,这一说法让我一再感到惊讶。 这种想法让我觉得很奇怪,尤其是来自哈斯凯勒的时候,原因如下:

  • 使用惰性函数语言,我们随意地在有限的机器上用无限的数据编程。结果,我们得到了可爱的模块化,如约翰·休斯的经典论文所示
  • 有很多在连续空间中编程的例子,例如向量图形,但也有类似的例子
  • 我喜欢我的程序反映我对问题空间的看法,而不是对执行程序的机器的看法,我倾向于期望其他高级语言程序员也有同样的偏好。 (“当一种编程语言的程序需要注意不相关的东西时,它是低级的。”-艾伦·佩利斯)
从和(第一个DCTP/FRP系统)到后来,我一直在为连续时间编程制作库。 它很容易正确实现。 本文介绍了几种不同的方法。 有效地(并且仍然正确地)实现连续时间是另一回事,尤其是避免重新计算不变的值。 (见报纸。)

有关相关备注,请参阅并更新:有关连续时间为何重要的更多信息,请参阅。更新:另请参见我的2015年演讲(以及与之相关的演讲)

祝你的探索好运,如果你有任何问题,请告诉我。
我的联系信息已打开。

我的
world->world
模型有两个主要问题。首先,除非我感到困惑,否则该模型只支持顺序组合,对并行组合不友好。想象一下,您可以如何并行地组合两个
world->world
值。第二,我不知道它怎么可能支持连续时间。这两个问题都阻碍了可组合性,这是我在库设计中的一个关键目标。我感兴趣的是,连续函数的概念都是关于有限限制的。函数连续性的定义是:对于想要输出的有限数量的信息,存在必须输入的有限数量的信息。因此,如果您使用的是连续时间,那么您所需要的只是连续函数,这是非常自然的。@Conal是RxJS还是Bacon.js?若否,原因为何?它们与您上面描述的有什么不同?“他们应该叫别的名字吗?”布拉德福德明白了。据我所知,Rx和Bacon.js都缺乏这两个基本功能