Locked. This question and its answers are locked,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。
我已经阅读了reactive programming上的Wikipedia文章。我还阅读了有关functional reactive programming的小文章。描述非常抽象。
实际上,函数式响应式(Reactive)编程(FRP)是什么意思? 响应式(Reactive)编程(与非响应式(Reactive)编程相对)由什么组成?
我的背景是命令式/OO语言,因此希望了解与该范例有关的解释。 动态/不断变化的值(即“随时间变化的值”)本身就是一等值。您可以定义它们并组合它们,将它们传入和传出函数。我称这些事情为“行为”。 行为是由一些原语建立的,例如恒定(静态)行为和时间(例如时钟),然后采用顺序和并行组合。通过应用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的精神中得到或多或少的东西。
我从哪里得到这些原则?在软件设计中,我总是问相同的问题:“这是什么意思?”。
指称语义为我提供了一个精确的框架,这个框架符合我的审美观(不同于操作性或公理性语义,这两个都使我不满意)。
所以我问自己什么是行为?
我很快意识到,命令式计算在时间上的离散性是对特定类型机器的一种适应,而不是对行为本身的自然描述。
我能想到的最简单的行为描述就是“(连续)时间的函数”,这就是我的模型。
令人高兴的是,此模型轻松而优雅地处理了连续的确定性并发。
正确有效地实现此模型是一个很大的挑战,但这是另一回事了。
我已经阅读了reactive programming上的Wikipedia文章。我还阅读了有关functional reactive programming的小文章。描述非常抽象。
我的背景是命令式/OO语言,因此希望了解与该范例有关的解释。
最佳答案
如果您想体验一下FRP,可以从1998年的旧Fran tutorial开始,它带有动画插图。对于论文,请从Functional Reactive Animation开始,然后继续浏览我主页上的出版物链接和FRP上的Haskell wiki链接。
就个人而言,我想在解决如何实现FRP之前先考虑一下FRP的含义。
(没有规范的代码是没有问题的答案,因此“甚至没有错”。)
因此,我不像托马斯·K在另一个答案(图形,节点,边,触发,执行等)中那样用表示/实现术语来描述FRP。
有许多可能的实现样式,但是没有实现说明FRP是什么。
我确实对Laurence G的简单描述感到共鸣,即FRP是关于“表示值“随着时间的推移”的数据类型”的。
传统的命令式编程只能通过状态和突变间接地捕获这些动态值。
完整的历史记录(过去,现在,将来)没有一流的表示。
此外,由于命令式范式在时间上是离散的,因此只能(间接)捕获离散的演化值。
相比之下,FRP直接捕获这些不断变化的值,而连续不断变化的值没有困难。
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的精神中得到或多或少的东西。
我从哪里得到这些原则?在软件设计中,我总是问相同的问题:“这是什么意思?”。
指称语义为我提供了一个精确的框架,这个框架符合我的审美观(不同于操作性或公理性语义,这两个都使我不满意)。
所以我问自己什么是行为?
我很快意识到,命令式计算在时间上的离散性是对特定类型机器的一种适应,而不是对行为本身的自然描述。
我能想到的最简单的行为描述就是“(连续)时间的函数”,这就是我的模型。
令人高兴的是,此模型轻松而优雅地处理了连续的确定性并发。
正确有效地实现此模型是一个很大的挑战,但这是另一回事了。
10-06 15:15