函数式编程应用的窗户纸

原创文章转载请注明出处

关于函数式编程的概念这里不做深入介绍,这里要讲的是函数式编程的部分应用场景,如果下面这些内容你都了解了,那么再去看函数式编程的介绍你就可以很快的理解了,甚至你可能发现自己在不知不觉中已经使用了很多函数式编程的技巧了。

1. map、reduce、filter...#

函数式编程最常见的技术就是对一个集合做Map、Reduce和Filter操作,map对集合成员做了映射操作,生成新的集合;reduce就是降维操作,化整为零;filter顾名思义通过过滤器生成新的集合。
Python

map(lambda x: x ** 2, [1, 2, 3, 4, 5])
filter(lambda x: x & 1 != 0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
reduce(lambda x, y: x + y, [2, 3, 4, 5, 6], 1)  #((((((1+2)+3)+4)+5)+6))

Swift

[1, 2, 3, 4, 5].map { i in return i*i }
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].filter { (i) -> Bool in return i & 1 != 0 }
[2, 3, 4, 5, 6].reduce(1) { (result, i) -> Int in return result + i }

这里不深究Swift的闭包语法,我知道尾随闭包可以简写。
以上两种语言的代码,转换后输出的结果都是:

[1, 4, 9, 16, 25]
[1, 3, 5, 7, 9]
21

我们将函数作为参数传给了map/filter/reduce函数,告诉这些函数你们要对数组元素进行什么操作,而不是使用低级的循环迭代方式来操作数组元素。变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数,函数式编程就是指这种高度抽象的编程范式。

2. currying 柯里化##

柯里化 (Currying),也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数而且返回结果的新方法。
Python

def inc(x):
    def incx(y):
        return x+y
    return incx
 
inc2 = inc(2)
inc5 = inc(5)
 
print inc2(5) # 输出 7
print inc5(5) # 输出 10

Swift

//下面这种Currying语法在Swift 3.0已经被移除了。
//func inc(x: Int)(y: Int) -> Int { return x + y } 
//你可以这么写,看起来跟Python的样式比较接近
func inc(x:Int) -> ((Int) -> Int) {
    return { y in
        return x + y
    }
}
let inc2 = inc(x: 2)
let inc5 = inc(x: 5)
print(inc2(5))

↑函数式编程的特点:把函数当成变量来用。

函数式编程的应用场景还有许多,这里没有全部列出,诸如递归、惰性求值(Lazy)等。也许你自己都不知道已经在不知不觉的使用着函数式编程,看完上面的介绍是不是更能体会到函数式编程的思维逻辑?

需要注意的是,FP(函数式编程)和FRP(函数响应式编程)是有差别的,我的理解是FRP是FP的更高级应用,FRP提供了一种信号机制,通过信号来记录值的变化。信号可以被叠加、分割或合并,通过对信号的组合,就不需要去监听某个值或事件。至于MVVM,那是一种应用FRP实现的开发模型,以区别于传统的MVC模型。比如iOS上的RAC/RxSwift都是FRP框架,可以利用RAC/RxSwift来实现MVVM开发模型。

我是咕咕鸡,一个还在不停学习的全栈工程师。
热爱生活,喜欢跑步,家庭是我不断向前进步的动力。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容