什么是(函数式)反应式编程?

2024-05-02

我读过维基百科的文章反应式编程 http://en.wikipedia.org/wiki/Reactive_programming。我还读过有关的小文章函数反应式编程 http://en.wikipedia.org/wiki/Functional_reactive_programming。描述很抽象。

  1. 函数式反应式编程(FRP)在实践中意味着什么?
  2. 反应式编程(相对于非反应式编程?)由什么组成?

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


如果你想感受一下玻璃钢,你可以从旧的开始弗兰教程 http://conal.net/fran/tutorial.htm从 1998 年开始,有动画插图。对于论文,从功能反应动画 http://conal.net/papers/icfp97/然后跟踪我主页上的出版物链接和FRP http://haskell.org/haskellwiki/FRP链接上的哈斯克尔维基 http://haskell.org/haskellwiki/Haskell.

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

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

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

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

  • 动态/演变的价值观(即“随着时间的推移”的价值观)本身就是一流的价值观。您可以定义它们并组合它们,将它们传入或传出函数。我把这些东西称为“行为”。

  • 行为是由一些原语构建的,例如恒定(静态)行为和时间(如时钟),然后进行顺序和并行组合。n通过应用 n 元函数(在静态值上)“逐点”(即随时间连续)来组合行为。

  • 为了解释离散现象,有另一种类型(系列)的“事件”,每个事件都有一个发生流(有限或无限)。每次发生都有相关的时间和值。

  • 要想出可以构建所有行为和事件的组合词汇,请玩一些例子。继续解构为更通用/简单的部分。

  • 为了让你知道你有坚实的基础,使用指称语义技术为整个模型提供一个组合基础,这意味着(a)每种类型都有一个相应的简单而精确的数学类型的“含义”,并且( b) 每个原语和运算符都有一个简单而精确的含义,作为成分含义的函数。永远不能将实施考虑因素融入到您的探索过程中。如果此描述对您来说是胡言乱语,请参阅 (a)具有类型类态射的指称设计 http://conal.net/papers/type-class-morphisms, (b) 推拉函数反应式编程 http://conal.net/papers/push-pull-frp(忽略实现位),以及 (c)指称语义Haskell 维基百科页面 http://en.wikibooks.org/wiki/Haskell/Denotational_semantics。请注意,指称语义有两个部分,分别来自其两位创始人 Christopher Strachey 和 Dana Scott:更简单且更有用的 Strachey 部分和更难且不太有用(对于软件设计)Scott 部分。

如果您坚持这些原则,我希望您或多或少会得到一些符合 FRP 精神的东西。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是(函数式)反应式编程? 的相关文章

  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • F# 中的动态编程

    实现解决问题的动态规划算法的最优雅的方法是什么子问题重叠的问题 http en wikipedia org wiki Overlapping subproblem 在命令式编程中 人们通常会创建一个按问题大小索引的数组 至少在一维 然后算法
  • Java 中的故障安全迭代器和故障快速迭代器是什么

    Java 中有两种类型的迭代器 故障安全迭代器和故障快速迭代器 这是什么意思 它们之间有什么区别 他们之间有什么区别 故障安全 在工程方面 https en wikipedia org wiki Fail safe 表示某事物发生故障但不会
  • 某些数据结构是否比其他数据结构更适合函数式编程?

    In 现实世界哈斯克尔 http book realworldhaskell org 有一个标题为 没有数组或哈希表的生活 的部分 其中作者建议在函数式编程中首选列表和树 而在命令式程序中可能会使用数组或哈希表 这是有道理的 因为在创建新列
  • 如何在 Swift Joint 中创建自定义链?

    我正在尝试创建一个LocationManager组合的包装 我有一个发布者和一些触发发布者的函数 但是 我想将它们与自定义命令组合在一起 这是我到目前为止得到的 available OSX 10 15 iOS 13 tvOS 13 watc
  • 哪种编程语言或库可以处理无限级数?

    哪种编程语言或库能够处理无限级数 例如几何级数或调和级数 它可能必须有一些众所周知的系列的数据库 并在收敛的情况下自动给出适当的值 并且可能在发散的情况下生成异常 例如 在 Python 中 它可能如下所示 sum 0 sign 1 0 f
  • 在 Python 中,部分函数应用(柯里化)与显式函数定义

    在 Python 中 以下方式是否被认为是更好的风格 根据更一般的 可能是内部使用的功能显式定义有用的功能 或者 使用偏函数应用来显式描述函数柯里化 我将通过一个人为的例子来解释我的问题 假设编写一个函数 sort by scoring 它
  • 承诺的反面是什么?

    承诺代表将来可能可用 或无法实现 的值 我正在寻找的是一种数据类型 它表示将来可能变得不可用的可用值 可能是由于错误 Promise a b TransitionFromTo
  • “单体”是什么意思?

    我在课堂上看到过它 我怀疑这意味着该类可以被分解为逻辑子单元 但我找不到一个好的定义 你能举一些例子吗 谢谢您的帮助 编辑 我喜欢聪明的回复 但我显然指的是软件上下文中的 整体 我了解巨石 巨石 支石墓以及所有与石头相关的背景 哎呀 我的国
  • 带参数的 Python 列表过滤

    python中有没有一种方法可以在列表上调用过滤器 其中过滤函数在调用期间绑定了许多参数 例如有没有办法做这样的事情 gt gt def foo a b c return a lt b and b lt c gt gt myList 1 2
  • C++0x (C++11) 作为函数式语言?

    我想知道 C 0x C 11 带有 lambda 和完美转发 是否是一种函数式语言 的超集 函数式语言有什么特性是 C 所没有的吗 函数式编程范式将计算建模为集合之间的关系 因此本质上是声明性的 然而 在实践中 我们通常认为函数是命令式的
  • 如何轻松地将 Observable 转换或分配给行为主体,以便其他组件可以共享它

    我是可观察风格编程的新手 我有一个问题 我想在组件之间跨应用程序共享用户信息 并且我使用BehaviorSubject 来共享此信息 这是受到将BehaviorSubject 共享为AuthInfo 的启发 如果我可以在我的应用程序组件中共
  • Haskell 真的是纯粹的吗(有任何语言可以处理系统外的输入和输出)吗?

    在谈到函数式编程中的 Monad 后 该功能是否真的使语言变得纯粹 或者它只是黑板数学之外的现实世界中计算机系统推理的另一张 免狱卡 EDIT 这不是有人在这篇文章中所说的火焰诱饵 而是一个真正的问题 我希望有人能用它来击倒我并说 证明 它
  • 函数式编程是否避免了状态?

    根据维基百科 http en wikipedia org wiki Functional programming 函数式编程是一种编程范式 它将计算视为数学函数的评估避免状态和可变数据 强调我的 这是真的吗 我个人的理解是 它使状态更加明确
  • 如何向 Scotty 中间件添加基本身份验证?

    我目前正在制作 Scotty API 但找不到任何 basicAuth 实现的示例 Wai Middleware HttpAuth 具体来说 我想将基本身份验证标头 用户 通行证 添加到我的某些端点 即以 admin 开头的端点 我已经设置
  • 如何在 Haskell 中枚举递归数据类型?

    这篇博文 http lukepalmer wordpress com 2008 05 02 enumerating a context free language 对于如何使用 Omega monad 对角枚举任意语法有一个有趣的解释 他提
  • 如何在 Objective-C 中编写 lambda 方法?

    如何在 Objective C 中编写 lambda 方法 Objective C 中 lambda 的概念现在封装为Blocks http developer apple com mac library documentation Coc
  • 如何在 F# 中执行 Seq.takeWhile + 一项

    我想编写一个使用谓词过滤序列的函数 但结果还应该包括谓词返回 false 的第一个项目 如果 F 中有一个break关键字 逻辑将是这样的 let myFilter predicate s seq for item in s do yiel
  • 类型级编程有哪些示例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不明白 类型级编程 是什么意思 也无法使用Google找到合适的解释 有人可以提供一个演示类型级编程的示例吗 范式的解释和 或定义将
  • 在 Java 8 中使用映射函数时类型转换不起作用

    我正在比较两个列表 List allUserGroups UserBC getAllGroupsForUser userId deptID List

随机推荐