函数式编程圣经

前言:本文原作者BlindingDark, 老刘做了修改。

编程的世界是由许多平行宇宙组成的,面向对象宇宙中的上帝给人类讲述了OO大法,形成了《面向对象圣经》。与此同时,在编号为C-137的平行宇宙中,函数式上帝开始工作了......

1

第一天

上帝看到约翰·麦卡锡发明了表处理语言 Lisp,却只用来学术研究,很是伤心,就把 Lisp 解释器的秘密告诉了他的学生斯蒂芬·罗素,斯蒂芬·罗素将eval函数在IBM 704机器上实现后,函数式编程的大门第一次向人类打开了。


2

第二天

这个平行宇宙的上帝思想独特,他说:“ 要有不变量”                


0?wx_fmt=png


上帝又说: “函数应该是纯粹的(纯函数)”


不能修改传递给函数的变量!


不能修改全局变量!


对于同样的输入参数,返回值总是相同的!

下面的函数是被允许的,每次调用,返回值都相同,可以安全地调用,直到宇宙毁灭。


0?wx_fmt=png

这样的函数在函数式宇宙中是不允许的,因为第二次调用就会导致函数式宇宙的毁灭。


0?wx_fmt=png

这个函数是不被允许的,它竟然想修改输入参数!


0?wx_fmt=png

如果函数返回了一个新的数组,而没有改变原有的值,那函数式上帝很高兴。


0?wx_fmt=png

人类对于上帝立下的规矩表示迷惑不解: are you kiding me ?


3

第三天

人类尝试着写程序,由于不变量的规定,发现连个最基本的for 循环都搞不定。

0?wx_fmt=png


人类迷惑不解:“有没有搞错, 我们怎么写循环?”

上帝说:“你们用循环干什么?”

人类写了一段代码。

0?wx_fmt=png

上帝说:要有递归!  

上帝也写了一段代码:

0?wx_fmt=png

人类说:“这虽然能完成工作,但是好像不太直观啊!再说,亲爱的上帝,如果我那个list容量很大,递归层次很深,会不会出现栈溢出?”

上帝说:“没事,我有尾递归,保证不溢出。这种递归的写法,你们慢慢就习惯了。”

(友情提示:尾递归在《张大胖学递归》中有描述)

4

第四天

上帝发现很多函数大体上都是相同的,只有部分细节不一样,有很多重复代码,太浪费了。

0?wx_fmt=png

上帝说:“要有高阶函数!”

让函数来生成函数,把公用的部分抽取出来,不共用的部分与共用部分能组合起来。

0?wx_fmt=png

上帝提供了几个很好用的高阶函数,如map,filter, fold等,让人类快速高效地去操作集合数据。

0?wx_fmt=png

5

第五天

上帝对自己的工作很满意。仿佛程序世界的框架已经基本完成,只剩下边边角角的实现了。 

可是这个宇宙的人类总是抱怨函数式编程太难,看到这里的上帝不愿意改变,有很多人都穿越到编号为S-87那个所谓“面向对象”的宇宙去了。

上帝叹了口气:“你们呐,目光短浅,摩尔定律已经失效,多核时代已经来临,我们函数式编程天生是为并发编程而生的啊,你看看函数没有side effect,不共享变量,可以安全地调度到任何一个CPU core上去运行,没有烦人的加锁问题,多好啊!”

过了两天,隔壁 S-87 宇宙的面向对象上帝来串门了。

面向对象上帝说:“亲爱的函数式上帝,听叛逃者,不,投诚者,啊,是穿越到我那里的人说,你这个宇宙有个叫做函数式编程的宝贝?”

函数式上帝:“还宝贝?!人都跑光了!”

“你给我讲讲吧,到时候我再劝他们回来。”

函数式上帝于是给他讲了自己创世纪时立下的规矩,还讲了很多他打算在第6天,第7天告诉人类的知识,什么Currying, 惰性求值,宏(macro)等等。

面向对象上帝表示感谢,喜滋滋地回去了。

后来,函数式上帝听说面向对象的宇宙出现了不少混合式风格编程的语言 OOP + FP (Functional Programming),也就没多少人再回到自己的宇宙了。

函数式上帝什么都没说,叹了口气。

6

第六天

函数式上帝决定休息。

7

第七天

函数式上帝继续休息。

这就是为什么函数式世界的程序员能休息两天的来历。


推荐阅读:

面向对象圣经

张大胖学递归

(完)

你看到的只是冰山一角, 更多精彩文章,请移步《2016文章精华》或者《2017文章精华


码农翻身

用故事讲述技术

0.jpeg

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Go语言圣经》是一本广受好评的教材,旨在帮助读者系统地学习和掌握Go语言。这本书以简明清晰的方介绍了Go语言的各种特性、语法和用法,是入门和进阶者的理想选择。 首先,该书提供了对Go语言基础知识的全面介绍。它从简单到复杂地解释了Go语言的基本概念,诸如变量、函数、循环和条件语句等等。通过丰富的例子和练习,读者能够逐步理解和掌握这些概念。 其次,该书详细介绍了Go语言的高级特性和用法。读者可以学习到Go语言的面向对象编程、并发编程、网络编程等关键技术。并发编程是Go语言的一个独特特性,对于提高程序性能和扩展能力非常重要。 此外,该书还包含了对常见问题和陷阱的讲解,帮助读者避免一些常见的错误和陷阱。同时,书中提供了大量的案例和实践项目,读者可以通过实际操作来巩固所学内容。 《Go语言圣经》以其简洁明了的风格和对细节的深入讲解而闻名。无论是作为初学者的入门指南,还是作为有经验的开发者的参考书,这本书都能满足读者的需求。此外,该书的PDF版本能够方便地在线或离线阅读,为读者提供了更加便捷的学习体验。 综上所述,《Go语言圣经》是一本内容丰富、权威性强的优秀教材。它不仅适合Go语言的初学者,也适用于那些想要深入学习和掌握Go语言的开发者。无论是在线阅读还是PDF版本,读者都能够方便地获取和利用这本宝贵的学习资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值