锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。
我已经阅读了关于 reactive programming 的维基百科文章.我还阅读了 functional reactive programming 上的小文章.描述很抽象。
我的背景是命令式/面向对象语言,因此与此范例相关的解释将不胜感激。
最佳答案
如果你想感受一下 FRP,你可以从旧的 Fran tutorial 开始从 1998 年开始,其中有动画插图。对于论文,从 Functional Reactive Animation 开始然后跟进我主页上的出版物链接和 FRP 上的链接。 Haskell wiki 上的链接.
就个人而言,我喜欢在讨论如何实现之前先考虑 FRP 的含义。
(没有规范的代码是没有问题的答案,因此“甚至没有错”。)
因此,我不会像 Thomas K 在另一个答案(图形、节点、边、触发、执行等)中那样用表示/实现术语来描述 FRP。
有许多可能的实现风格,但没有一个实现说明 FRP 是什么。
我确实对 Laurence G 的简单描述产生了共鸣,即 FRP 是关于“表示‘随时间变化’的值的数据类型”。
传统的命令式编程只是通过状态和突变间接地捕获这些动态值。
完整的历史(过去、现在、 future )没有一流的代表。
此外,由于命令范式在时间上是离散的,因此只能(间接)捕获离散演化的值。
相比之下,FRP 直接捕捉到这些不断演化的值,对于不断演化的值没有任何困难。
FRP 的独特之处还在于它是并发的,而不会与困扰命令式并发的理论和实用鼠巢发生冲突。
从语义上讲,FRP 的并发是细粒度的、确定的和连续的。
(我说的是意义,而不是实现。实现可能涉及也可能不涉及并发或并行。)
语义确定性对于推理非常重要,无论是严谨的还是非正式的。
虽然并发为命令式编程增加了巨大的复杂性(由于非确定性交错),但在 FRP 中却毫不费力。
那么,什么是玻璃钢?
你本可以自己发明的。
从这些想法开始:
永远不要将实现考虑因素混入您的探索过程中。如果这个描述对你来说是胡言乱语,请咨询 (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/