|
|
1
930
如果你想了解FRP,你可以从旧的开始 Fran tutorial 1998年,它有动画插图。对于论文,请从以下内容开始 Functional Reactive Animation 然后跟进我主页上的出版物链接和 FRP Haskell wiki . (没有规范的代码是没有问题的答案,因此“甚至没有错”。) 因此,我不会像Thomas K在另一个答案(图、节点、边、触发、执行等)中那样用表示/实现的术语来描述FRP。 是 . 完整的历史(过去、现在、未来)没有一流的代表性。 由于命令式范式在时间上是离散的,因此可以(间接地)捕获值。 相比之下,FRP捕捉到了这些不断变化的价值观 持续地 细粒的 , 连续的 . (我说的是意义,而不是实现。实现可能涉及也可能不涉及并发或并行。) 语义确定性对于推理非常重要,无论是严谨的还是非正式的。 虽然并发性给命令式编程增加了巨大的复杂性(由于非确定性交织),但在FRP中却毫不费力。 那么,什么是FRP? 从这些想法开始:
如果你坚持这些原则,我希望你或多或少会得到一些符合FRP精神的东西。
|
|
2
737
在保持函数式风格的同时获得类似副作用的行为的一种方法是使用函数式响应式编程。这是函数式编程和响应式编程的结合。(你链接到的维基百科文章是关于后者的。) 响应式编程背后的基本思想是,有某些数据类型表示“随时间”变化的值。涉及这些随时间变化的值的计算本身也会随着时间的推移而变化。 例如,您可以将鼠标坐标表示为随时间变化的一对整数。假设我们有这样的东西(这是伪代码):
鼠标指针周围会画一个32x32的框,无论它移动到哪里,都会跟踪它。 这是一个相当不错的 paper on functional reactive programming . |
|
|
3
144
一个简单的方法是,想象你的程序是一个电子表格,你的所有变量都是单元格。如果电子表格中的任何单元格发生更改,则引用该单元格的任何单元格也会发生更改。FRP也是一样。现在想象一下,一些单元格会自行更改(或者更确切地说,是从外部世界获取的):在GUI情况下,鼠标的位置就是一个很好的例子。
|
|
4
131
对我来说,这是关于符号的两种不同含义
|
|
|
5
69
好的,从背景知识和阅读你指向的维基百科页面来看,反应式编程似乎有点像数据流计算,但有特定的外部“刺激”触发一组节点启动并执行计算。
有关“数据流计算”的更多信息,请在维基百科上或使用您最喜欢的搜索引擎搜索这两个词。总体思路是:该程序是一个有向的节点图,每个节点都执行一些简单的计算。这些节点通过图形链接相互连接,图形链接将一些节点的输出提供给其他节点的输入。 当节点触发或执行其计算时,连接到其输出的节点会“触发”或“标记”其相应的输入。所有输入被触发/标记/可用的任何节点都会自动触发。该图可能是隐式的,也可能是显式的,具体取决于反应式编程的实现方式。 节点可以被视为并行启动,但它们通常是串行执行的,或者并行性有限(例如,可能有几个线程在执行它们)。一个著名的例子是 Manchester Dataflow Machine ,其(IIRC)使用标记数据架构通过一个或多个执行单元来调度图中节点的执行。数据流计算非常适合异步触发计算以产生级联计算的情况,而不是试图由一个或多个时钟来控制执行。
“非反应性”编程将是对执行流和与外部输入的关系有非常不同的看法的编程。这可能有点主观,因为人们可能会想说任何对外部输入有反应的话。但从精神上看,一个以固定间隔轮询事件队列并将发现的任何事件分派给函数(或线程)的程序反应性较差(因为它只以固定间隔处理用户输入)。同样,这也是事情的精神所在:人们可以想象将一个具有快速轮询间隔的轮询实现以非常低的级别放入系统中,并在其之上以被动的方式进行编程。 |
|
|
6
65
this 关于FRP的启发性写作,终于让我明白了FRP的真正含义。 下面我引用Heinrich Apfelmus(反应性香蕉的作者)的话。
所以,在
悟性
FRP程序是一组方程式:
编辑: 在最初回答大约2年后,我最近得出的结论是,FRP实施还有另一个重要方面。他们需要(并且通常确实)解决一个重要的实际问题: .
|
|
7
29
Simply efficient functional reactivity Conal Elliott( direct PDF Push-pull functional reactive programming direct PDF 286KB)。 |
|
|
8
28
Iterable是一个延迟消费的序列——每当迭代器想要使用它时,它都会拉取每个项目,因此枚举是由消费者驱动的。
|
|
|
9
18
Fran 辅导的。非常欢迎提出建议,我正在考虑在此基础上启动一个游戏引擎。
|
|
|
10
14
保罗·胡达克的书, The Haskell School of Expression ,不仅是对Haskell的一个很好的介绍,而且在FRP上也花了相当多的时间。如果你是FRP的初学者,我强烈建议你了解FRP的工作原理。 这本书(2011年出版,2014年更新)似乎也有新的重写, The Haskell School of Music . |
|
|
11
10
X 十、 X : T 十、 T 是时间的类型,无论是自然数、整数还是连续体。现在,当我们写作 y X +1在编程语言中,我们实际上是指方程式 y ( X ( |
|
|
12
9
如前所述,其行为类似于电子表格。通常基于事件驱动框架。
根据我对参与者分布式流网络的经验,它很容易成为节点网络状态一致性的一般问题的牺牲品,即你最终会在奇怪的循环中出现很多振荡和陷阱。
|
|
|
13
8
|
|
|
14
7
This article 安德烈·斯塔尔茨的这篇文章是我迄今为止看到的最好、最清晰的解释。
|
|
15
5
它是关于随时间(或忽略时间)进行的数学数据转换。 在代码中,这意味着函数纯度和声明性编程。
在FRP中,你描述了(就像在声明式编程中一样)数据如何从一个状态转换到另一个状态以及触发它的原因。这允许你忽略时间,因为你的函数只是对其输入做出反应,并使用它们的当前值来创建一个新的值。这意味着状态包含在转换节点的图(或树)中,并且在功能上是纯的。
因此,通过消除共享状态的复杂性和随时间变化的价值观。你的程序更容易推理。
行为是事件流+内存中的某个值。
http://infoscience.epfl.ch/record/148043/files/DeprecatingObserversTR2010.pdf |
|
|
16
2
Cyclejs - Reactive Programming ,它使用简单直观的样本。
这是一个很好的起点,而不是一个完整的知识来源。从那里,你可以跳到更复杂、更深入的论文。 |
|
|
17
0
(摘自MyObservableSetOfMouseMovements中的m 选择新点(m.X,m.Y))。
|
|
|
18
0
FRP是函数式编程(建立在一切都是函数的思想之上的编程范式)和反应式编程范式(建立在万物都是流的思想之上(观察者和可观察哲学))的结合。它应该是世界上最好的。
|
|
|
Viraj · 反应式编程如何实现相关结果 8 年前 |
|
|
val · 在Shiny中应用传单贴图边界过滤数据 8 年前 |
|
|
feerlay · RxJS-将可观察对象一分为二,等待第一个完成 8 年前 |
|
|
n0shadow · RxJava:为一个完整表列表指定最大并发性 8 年前 |