50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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

  • 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:403957
用户头像

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

关注

评论

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

YashanDB数据库事务管理及并发控制实战

数据库砖家

云闪付联合HarmonyOS SDK打造更便捷安全的支付体验

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

卡片一放,服务直达!实现信息零层级触达

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

YashanDB数据库事务日志分析及疑难排查教程

数据库砖家

YashanDB数据库事务隔离级别调优技巧

数据库砖家

YashanDB数据库数据备份策略及灾难恢复实战分享

数据库砖家

搭建一面LED广告墙的总成本解析

Dylan

广告 LED LED display LED显示屏 LED屏幕

大数据-82 Spark 集群架构与部署模式:核心组件、资源管理与调优

武子康

Java 大数据 flink spark 分布式

基于YOLOv8的X光安检图像智能检测系统:八类违禁品/可疑物精准识别与实战部署

申公豹

yolo

YashanDB数据库事务隔离级别设置及影响

数据库砖家

地平线具身智能算法H-RDT斩获CVPR 2025 RoboTwin真机赛冠军

地平线开发者

自动驾驶 地平线征程6 机器人展会

高性能通知系统架构设计与运维

俞凡

架构

AI中的潜意识学习:大语言模型隐藏的安全隐患

qife122

神经网络 AI安全 潜意识学习

OpenAI GPT-Realtime 发布:支持 SIP、MCP、异步函数调用和副语言信息捕捉,但依然贵丨日报

声网

AI如何重塑网络路由与交换技术

qife122

人工智能 网络设备

创建南网特色科技成果转化生态中枢——南方电网创新加速器首期路演活动成功举办

新消费日报

新手必看:如何使用问小白生成mp.jobleap4u.com站点简介(含精品prompt分享)

Y11

求职 找工作 招聘 应届生 大学生

攻击性威胁情报:红队视角下的CTI实战应用

qife122

红队 威胁情报 攻击模拟

极兔速递2025上半年经调整净利润同比大增147.1%

财见

YashanDB数据库实现实时数据处理的技巧

数据库砖家

一步完成CalDAV账户同步,日历服务助力钉钉日历日程集中管理

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

书写不再“断片”!Pen Kit报点预测丝滑如真笔

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

网龙公布 2025 年中期业绩

财见

2025年 华为鸿蒙创新赛比赛流程 全攻略

万少

HarmonyOS

BigCache: Go 高性能内存缓存实现

俞凡

golang 架构

干货:Gemini与jobleap.cn联动,一种邪修找工作的新方法,让你面试成功率立即提升500%!

Y11

求职 找工作 应届生 找实习

YashanDB数据库实现跨平台数据同步的技术实践

数据库砖家

YashanDB数据库实现数据实时同步的技术路径

数据库砖家

YashanDB数据库事务隔离级别与性能权衡

数据库砖家

YashanDB数据库事务日志管理实用教程

数据库砖家

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