最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

关于响应式编程你可能错过的信息

  • 2014-07-04
  • 本文字数:1706 字

    阅读完需:约 6 分钟

在函数式编程重新焕发生命力的当下,结合了函数式编程思想的函数式响应型编程(Functional Reactive Programming,简称 FRP)在 GUI 编程等领域又吹来一阵清风。虽然 FRP 的理论与实践可以追溯到上个世纪九十年代,但它蕴含的诸多概念对于大多数程序员而言,还是全新的知识。维基百科对FRP 的定义为:

函数式响应型编程是使用函数式编程构建块针对响应式编程的一种编程范式。它主要用于GUI 编程、机器人技术、音乐流处理等领域,通过显式地对时间进行建模来简化问题域。

这样的定义未免太过于宽泛了。 Stackoverflow 对此的回答倒是详尽而细致地阐述了 FRP 的今世前身,可惜又失之艰深,若用于学术讨论,确乎是最佳选择。例如,我们可以阅读发表于 1997 年由 Conal Elliott 与 Paul Hudak 撰写的论文《 Functional Reactive Animation 》,以及同样由 Conal Elliot 于 1998 年发表的论文《 Composing Reactive Animations 》。

FRP 最早发源于 Haskell 社区。Haskell 官方网站专门介绍了FRP 的知识。这篇介绍还提供了诸多讲解FRP 的资源,同时提到了一些实现了FRP 的库,例如 Sodium Grapefruit Reactive Yampa 等。当然,这种来源于函数式编程的编程范式,自然也可以运用于除 Haskell 之外的其他具备函数式编程特性的语言,例如 JavaScript,Scala,F#等。因此,若要理解什么是 FRP,最佳方式莫过于通过一个完整的案例来理解。

近日,Andre Staltz 在 Github 上发布了一篇长文《关于响应式编程你可能错过的信息》,通过运用JavaScript 和RxJS,以FRP 的编程范式实现了如Twitter 中推荐朋友的功能。这篇文章围绕着FRP 的一个核心概念“FRP 是针对异步数据流进行编程”进行讲解,并抓住了FRP 的本质,即将任何事物都视为一个流对象,包括变量、用户输入、属性、缓存、数据结构等。这种针对流的处理方式有些像管道- 过滤器模式,而它又与函数式语言的组合子Combinator 是相呼应的。例如我们可以对流进行map、filter 等组合操作。而FRP 对事件的订阅,则符合观察者模式的设计思想。文中给出了一个FRP 例子,它用JavaScript 处理了“双击”的事件流:

复制代码
// The 4 lines of code that make the multi-click logic
var multiClickStream = clickStream
.buffer(function() { return clickStream.throttle(250); })
.map(function(list) { return list.length; })
.filter(function(x) { return x >= 2; });
// Same as above, but detects single clicks
var singleClickStream = clickStream
.buffer(function() { return clickStream.throttle(250); })
.map(function(list) { return list.length; })
.filter(function(x) { return x === 1; });
// Listen to both streams and render the text label accordingly
singleClickStream.subscribe(function (event) {
document.querySelector('h2').textContent = 'click';
});
multiClickStream.subscribe(function (numclicks) {
document.querySelector('h2').textContent = ''+numclicks+'x click';
});
Rx.Observable.merge(singleClickStream, multiClickStream)
.throttle(1000)
.subscribe(function (suggestion) {
document.querySelector('h2').textContent = '';
});

文中对例子的阐述,一个很有启发的内容是如何采用 FRP 的思想对需求进行分析。例如针对需求“通过 API 加载账号数据,并显示 3 个推荐”,即可以分解为:

  • doing a request
  • getting a response
  • rendering the response

这种将一切视为“流”,然后针对各个阶段进行数据转换的方式,非常符合函数式思想,也极好地阐述了 FRP 的基本要义。

若要了解 FRP 的详细知识,可以深入阅读 Andre Staltz 的这篇文章。此外,InfoQ 中国在去年也曾发表过由网易的邓际锋撰写的关于FRP 的文章《函数式反应型编程(FRP) —— 实时互动应用开发的新思路》。这篇文章很好地通过实现一个类似Flicker 的小应用阐述了FRP 的概念。


感谢杨赛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-07-04 00:403396
用户头像

发布了 109 篇内容, 共 39.7 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

KeeWiDB的高性能修炼之路:架构篇

腾讯云数据库

数据库 nosql redis 腾讯云数据库 KeeWiDB

颠覆传统BOM检查!用这个方法既​简单、快速又准确

华秋PCB

工具 PCB BOM PCB设计

【线上分享会回顾】九科信息董事&产品VP傅恺分享流程挖掘实践案例

九科Ninetech

2022-11微软漏洞通告

火绒安全

安全漏洞

袋鼠云产品功能更新报告 02 期丨有亿点点走心!

袋鼠云数栈

官宣!Taier1.3 新版本正式发布,新鲜功能抢先体验

袋鼠云数栈

Docker 镜像使用

我是一个茶壶

Docker 镜像 11月月更

重磅发布!星汉未来全国开发者悬赏计划

星汉未来

云计算 开发者 运维 云原生 星汉未来

Eureka框架的原理

阿泽🧸

Eureka 11月月更

Knative架构解析

穿过生命散发芬芳

Knative 11月月更

五大模型揭秘深度学习用于时序预测的最新进展

云智慧AIOps社区

人工智能 机器学习 深度学习 算法 模型

Redis的一些概念

饱饱巴士

redis 11月月更 redis梳理

无线标准802.11ac 和 802.11ax到底有什么区别?哪个更快?

wljslmz

网络技术 无线技术 802.11ac 802.11AX 11月月更

【C语言】do 关键字

謓泽

11月月更

云原生系列五:Kafka 集群数据迁移基于Kubernetes的内部

叶秋学长

kafka\ kurbernetes 11月月更

Oracle 表空间创建标准(二)

默默的成长

oracle 前端 11月月更

极客时间运维进阶训练营第三周作业

好吃不贵

持续优化,欣欣向云 | RocketMQ Operator 0.3.0 正式发布

阿里巴巴云原生

阿里云 RocketMQ 云原生

得物极光蓝纸箱尺寸设计实践

得物技术

算法 遗传算法 供应链 建模 运筹

三分钟带你了解一站式大数据平台运维管家 ChengYing 产品包制作

袋鼠云数栈

费劲拿到的阿里P8架构师私藏(java岗的)JCF和JUC源码分析与实现笔记

程序知音

Java 高并发 源码刨析 java架构 后端技术

获奖作品《重力》超详细制作过程!建议码住!

Renderbus瑞云渲染农场

Blender制作教程

阿里云 Landing Zone 上好云伙伴联盟正式起航

云布道师

阿里云 2022云栖大会

实战指南 | Serverless 架构下的应用开发

阿里巴巴云原生

阿里云 Serverless 云原生

七层模型

初学者

网络 服务器 11月月更

报名|企业数字化转型有何“利器”?一起来揭秘

元年技术洞察

数字化转型

AI生命周期 | 聊聊数据准备阶段的偏见问题

澳鹏Appen

人工智能 机器学习 数据标注 数据训练 数据偏见

开源密码管理器更安全吗?(2)

神锁离线版

开源 网络安全 信息安全 数据安全 密码管理器

大数据生态中的 RocketMQ 5.0

阿里巴巴云原生

阿里云 RocketMQ 云原生

SQL编写规范

默默的成长

前端 sql 11月月更

金融服务的超级App

FN0

生态 超级app 组装式应用

关于响应式编程你可能错过的信息_语言 & 开发_张逸_InfoQ精选文章