functional-programming - 什么是(函数式)响应式(Reactive)编程?

标签 functional-programming terminology reactive-programming frp

锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。








我已经阅读了关于 reactive programming 的维基百科文章.我还阅读了 functional reactive programming 上的小文章.描述很抽象。

  • 函数式响应式(Reactive)编程 (FRP) 在实践中意味着什么?
  • 响应式(Reactive)编程(相对于非响应式(Reactive)编程?)由什么组成?

  • 我的背景是命令式/面向对象语言,因此与此范例相关的解释将不胜感激。

    最佳答案

    如果你想感受一下 FRP,你可以从旧的 Fran tutorial 开始从 1998 年开始,其中有动画插图。对于论文,从 Functional Reactive Animation 开始然后跟进我主页上的出版物链接和 FRP 上的链接。 Haskell wiki 上的链接.

    就个人而言,我喜欢在讨论如何实现之前先考虑 FRP 的含义。
    (没有规范的代码是没有问题的答案,因此“甚至没有错”。)
    因此,我不会像 Thomas K 在另一个答案(图形、节点、边、触发、执行等)中那样用表示/实现术语来描述 FRP。
    有许多可能的实现风格,但没有一个实现说明 FRP 是什么。

    我确实对 Laurence G 的简单描述产生了共鸣,即 FRP 是关于“表示‘随时间变化’的值的数据类型”。
    传统的命令式编程只是通过状态和突变间接地捕获这些动态值。
    完整的历史(过去、现在、 future )没有一流的代表。
    此外,由于命令范式在时间上是离散的,因此只能(间接)捕获离散演化的值。
    相比之下,FRP 直接捕捉到这些不断演化的值,对于不断演化的值没有任何困难。

    FRP 的独特之处还在于它是并发的,而不会与困扰命令式并发的理论和实用鼠巢发生冲突。
    从语义上讲,FRP 的并发是细粒度的、确定的和连续的。
    (我说的是意义,而不是实现。实现可能涉及也可能不涉及并发或并行。)
    语义确定性对于推理非常重要,无论是严谨的还是非正式的。
    虽然并发为命令式编程增加了巨大的复杂性(由于非确定性交错),但在 FRP 中却毫不费力。

    那么,什么是玻璃钢?
    你本可以自己发明的。
    从这些想法开始:

  • 动态/不断变化的值(value)(即“随着时间推移”的值(value))本身就是一流的值(value)。您可以定义它们并组合它们,将它们传入和传出函数。我称这些事情为“行为”。
  • 行为是由一些原语构成的,如恒定(静态)行为和时间(如时钟),然后是顺序和并行组合。 n 个行为通过应用 n 元函数(在静态值上)“逐点”组合,即随着时间的推移连续进行。
  • 为了解释离散现象,有另一种类型(家族)的“事件”,每个事件都有一个流(有限或无限)的发生。每个事件都有一个关联的时间和值。
  • 为了提出可以构建所有行为和事件的组合词汇,请玩一些例子。继续解构成更通用/更简单的部分。
  • 为了让你知道你在坚实的基础上,给整个模型一个组合基础,使用指称语义的技术,这只是意味着(a)每个类型都有一个相应的简单和精确的数学类型的“含义”,和( b) 每个原语和运算符都具有简单而精确的含义,作为组成部分含义的函数。
    永远不要将实现考虑因素混入您的探索过程中。如果这个描述对你来说是胡言乱语,请咨询 (a) Denotational design with type class morphisms , (b) Push-pull functional reactive programming (忽略实现位),以及 (c) Denotational Semantics Haskell wikibooks page .请注意,指称语义有两个部分,来自其两位创始人 Christopher Strachey 和 Dana Scott:更容易和更有用的 Strachey 部分和更难和更没用(对于软件设计)Scott 的部分。

  • 如果你坚持这些原则,我预计你会或多或少地获得 FRP 精神的东西。

    我从哪里得到这些原则?在软件设计中,我总是问同样的问题:“这是什么意思?”。
    指称语义为这个问题提供了一个精确的框架,并且符合我的审美(不像操作或公理语义,这两者都让我不满意)。
    所以我问自己什么是行为?
    我很快意识到命令式计算的时间离散性质是对特定类型机器的适应,而不是对行为本身的自然描述。
    我能想到的对行为的最简单精确描述就是“(连续)时间的函数”,这就是我的模型。
    令人高兴的是,这个模型可以轻松优雅地处理连续的、确定性的并发。

    正确有效地实现这个模型是一个相当大的挑战,但这是另一回事。

    关于functional-programming - 什么是(函数式)响应式(Reactive)编程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1028250/

    相关文章:

    java - 如何在 RxJava 中返回聚合——collect() 是正确的方法吗?

    java - JVM 崩溃报告中的 oop 是什么意思?

    javascript - RxJs 中 switchLatest 和 flatmapLastest 有什么区别

    go - 动态函数返回类型

    java - 如何重构嵌套的切换用例(Java)或何时重构(Kotlin)?

    c++ - 根据定义,放置 "virtual destructor inside an interface"是否不再是接口(interface)?

    language-agnostic - 是否有任何模式或是否有任何用于继承数据/对象的标准术语?

    java - 使用 Spring Data Cassandra 进行直播(响应式(Reactive))

    functional-programming - 如何在 Ocaml 中表示一个简单的有限状态机?

    javascript - 如何从纯 JavaScript 函数中恢复源代码?