函数式反应式编程
函数式反应式编程(FRP) 是一种采用函数式编程的基础部件(如map、reduce、filter等)进行反应式编程(异步数据流程编程)的编程范式。FRP 被用于GUI、机器人和音乐方面的编程,旨在通过明确时间模型来简化这些问题。
编程范型 |
---|
FRP 的形式
自 1997 年 FRP 被提出以来,它产生了多种形式。[1]其中一条多样性的坐标轴是语义从离散到连续。 另一条轴是 FRP 系统可以如何被动态地更改。[2]
交互式 FRP
需要被指出的是,普通的 FRP 模型,从输入到输出都不太适合交互式程序。[8] 在从输入映射到输出的过程中缺乏“运行”程序的能力可能意味着必须使用以下解决方案之一:
- 创建一个用于输出的数据结构来表示活动。活动必须被一个外部的解释器或环境来运行。它继承了最初 Haskell 的流式 I/O 的全部难点。[9]
- 使用箭头化的 FRP 并嵌入能够处理动作的箭头。活动也必须要有ID,以便让它们分别维护不可变存储之类的东西。这就是 Fudgets 库采取的办法。[10]
- 最新颖的方法就是允许活动运行在现在(在 IO 单子中)但将它们结果的接收推迟到之后。[11] 它采用了事件 Event 和 IO 单子之间的交互,并与更加面向表达式的 FRP 兼容:
planNow :: Event (IO a) -> IO (Event a)
实现问题
存在两种类型的 FRP 系统,基于推送的和基于拉取的。基于推送的系统接收事件并将它们推过一个信号网络来达到某种结果。基于拉取的系统会等待结果请求,并逆向通过该网络来取回请求的结果。
某些 FRP 系统例如 Yampa 使用采样。在一个定期内,采样被推过一个信号网络。这种方法有两个缺点:在一个定期内处理样本的计算量会非常大,而且网络必须在等待采样区间的间隔时找出输入的更改。采样就是个基于推送的 FRP 示例。
Hackage 上的 Reactive 和 Etage 库介绍了一种叫做“推送-拉取 FRP” 的方式,它将基于推送和基于拉取的 FRP 最好的部分结合在了一起。按照这种方式,只有在定义纯粹的流上(如一系列时间固定的事件)的下一个事件被请求时,才会构造该事件。这些定义纯粹的流的行为类似于 Haskell 中的惰性列表。此为基于拉取的部分。基于推送的部分会在系统外部的事件被带入系统中时才会使用。外部的事件会被推送给消费者,这样它们就可以在它发布的瞬间找到该事件。
实现
参考来源
- Czaplicki, Evan, (PDF) (thesis), Harvard, Apr 2012 [2018-04-13], (原始内容 (PDF)存档于2016-06-04).
- Nilsson, Henrik; Courtney, Antony; Peterson, John, (PDF), (PDF) (2), Feb 2011 [2002] [2018-04-13], (原始内容存档 (PDF)于2017-10-10).
- Taha, Walid; Wan, Zhanyong; Hudak, Paul, , (PDF), Yale, 2002 [2018-04-13], (原始内容 (PDF)存档于2013-09-28).
- Czaplicki, Evan; Chong, Stephen, , , Harvard, 2013 [2018-04-13], (原始内容存档于2018-11-09).
- Wan, Zhanyong; Taha, Walid; Hudak, Paul, , (PDF) (1), Feb 2011 [2018-04-13], (原始内容 (PDF)存档于2013-09-28).
- Elliott, Conal; Hudak, Paul, , , 1997 [2018-04-13], (原始内容存档于2020-11-11).
- Courtney, Antony; Elliott, Conal, (PDF), , Yale, Feb 2011 [2001] [2018-04-13], (原始内容存档 (PDF)于2018-10-03).
- . [2018-04-13]. (原始内容存档于2015-07-24).
- (PDF). [2018-04-13]. (原始内容存档 (PDF)于2016-05-28).
- . [2018-04-13]. (原始内容存档于2020-01-24).
- (PDF). [2015年7月24日]. (原始内容 (PDF)存档于2015年7月1日).
外部链接
- "What is Functional Reactive Programming?"– 带有现场示例的FRP 介绍
- Elm Programming language页面存档备份,存于 – 一个函数式,反应式的编程语言,编译目标为HTML、CSS 和 JavaScript
- cellx 页面存档备份,存于 – 一个 JavaScript 实现的超快速反应式库
- Haskell 相关的 FRP 页面存档备份,存于 研究
- "Deprecating the Observer Pattern with Scala.React 页面存档备份,存于," – Scala.React, 一个 FRP 的 Scala 实现
- probability of living chart example - 使用ReactiveChart FRP 的无毛刺实现,详见文档 https://web.archive.org/web/20170927112527/https://reactivechart.com/knowledge/reactive/
- What is (functional) reactive programming? 页面存档备份,存于 – Stack Overflow 的问答
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.