函数响应式(Functional Reactive Programming

函数式编程(Functional Programming):

从一个数学函数公式开始:
y = f(x) -> x = f(x) -> y = f(f(x));
函数式编程就是二个字,“不变”。啥都不变,一经创建永远不变。如果要变,再创建个新的。在它里面函数就是数据的通道。参数确定时,结果是可以预测的。即:
以上函数式,参数 x 确定时,通过函数 f,返回 y 就确定了。
在并发编程中,一般会面对这样的三个问题:竞态条件、优先倒置、死锁问题。
而函数式编程中,由于数据全部都是不可变的,所以没有并发编程的问题,是线程安全的。
函数式编程的核心理念就是函数是值,它和结构体、整型或是布尔型没有什么区别。

响应式编程(Reactive Programming):

什么叫响应?
在生活中,你订阅的周刊,每一周到时间,就会收到,这就是一下响应了。
在程序中a = b + c,赋值之后 b 或者 c 的值变化后,a 的值不会跟着变化,即:

a = b + c;
b = 2;
c = 6;

这时 a 不会跟着变化,因为提示顺序执行。
而响应式编程目标就是,如果 b 或者 c 的数值发生变化,a 的数值会同时发生变化;

响应式它是依赖于事件的,响应式的代码运行不是按代码的顺序,而是跟多个按时间发生的事件有关。依赖事件?这不就是“回调”嘛,但在响应式编程里,这些按时间排列的事件,被称为“流”,stream。

简单的讲,响应式中的事件序列类似于程序中的数组,它里面的事件流就是时间的序列。

响应式编程依赖于事件,这里事件是什么?异步。而事件这个东西在响应式里被做为“事件序列“,被称为流,它里面包含的是事件的时间值,这些时间值就是数据。

那么可以说,响应式编程,就是异步的数据流的开发。

在这种思维中,万物都是“流”。点击是流,移动是流,选择是流,...,全是流stream,你可以操作这些流stream,输入,属性,回调等等。
然后你就是对这些流的各种操作,合并流,过滤流,一个流输入另一个流等等,没有流(stream),就没有响应式编程。
一个流就是一串事件发生的时间的值的序列。
这里面有至少三种东西:数据data;报错error;完成complete
这些都是通过异步操作,监听数据,监听error,监听complete事件。监听也叫“订阅”;而监听这些事件的函数,叫“观察者”;流stream就是“主体”,订阅 + 观察者,就是观察者模式

响应式编程,它的关注重点在于“大量的UI事件与数据的互相影响”。
什么意思呢?比如,某篇文章,你点个赞,那么
1、所有其它人能看到赞;
2、作者本人赞数量增加;
3、文章权重提升;
4、作者排名可能变化;......,
“一个数据的变化,它的影响可能是呈现网状扩散”。

它的特点,一是速度响应快,低延迟;二是健壮性弹性,有故障也能尽量响应;三是资源弹性,访问量大自动加资源,少了自动减;四是有消息自动传递。
响应式的思想,实际是观察者模式 + (stream与事件源的通信控制)。

函数响应式(Functional Reactive Programming,简称FRP)

为什么是函数响应式编程?

函数式:调用和执行;响应式:将变化传播。

函数式编程通过function的组合来解决问题。

响应式编程通过函数式编程的方式来解决回调的问题。

函数式编程特点:

函数是一等值 (first-class-values),换句话说,函数可以作为参数被传递到其它函数,也可以作为其它函数的返回值。
闭包和高阶函数:闭包是起函数的作用并可以像对象一样操作的对象。与此类似,FP 语言支持高阶函数。高阶函数可以用另一个函数(间接地,用一个表达式) 作为其输入参数,在某些情况下,它甚至返回一个函数作为其输出参数。这两种结构结合在一起使得可以用优雅的方式进行模块化编程,这是使用 FP 的最大好处。
递归: 用递归做为控制流程的机制。例如在Haskell的世界中,没有变量赋值,流程跳转,如果要实现一些简单的功能,比如求一个数组中的最大值,都需要借助递归实现。
惰性求值(Lazy Evaluation): 它表示为“延迟求值“和”最小化求值“。惰性求值使得代码具备了巨大的优化潜能。支持惰性求值的编译器会像数学家看待代数表达式那样看待函数式编程的程序:抵消相同项从而避免执行无谓的代码,安排代码执行顺序从而实现更高的执行效率甚至是减少错误。 惰性求值另一个重要的好处是它可以构造一个无限的数据类型,无需要担心由无穷计算所导致的 out-of-memory 错误。
没有"副作用"(side effect):指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。

响应式编程特点:

异步编程:提供了合适的异步编程模型,能够挖掘多核CPU的能力、提高效率、降低延迟和阻塞等。
数据流:基于数据流模型,响应式编程提供一套统一的Stream风格的数据处理接口。
变化传播:简单来说就是以一个数据流为输入,经过一连串操作转化为另一个数据流,然后分发给各个订阅者的过程。这就有点像函数式编程中的组合函数,将多个函数串联起来,把一组输入数据转化为格式迥异的输出数据。

参考资料:

  1. http://nicholas.ren/2015/06/24/lets-talk-about-reactive.html
  2. http://emacoo.cn/backend/reactive-overview/
  3. http://www.cnblogs.com/kym/archive/2011/03/07/1976519.html
  4. http://www.ruanyifeng.com/blog/2012/04/functional_programming.html
  5. http://janfan.cn/chinese/2015/05/18/functional-programming.html
  6. https://baike.baidu.com/item/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B/4035031
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351