趣味函数式编程圣经
<p>1</p><p>第一天</p>
<p>上帝看到约翰·麦卡锡发明了表处理语言 Lisp,却只用来学术研究,很是伤心,就把 Lisp 解释器的秘密告诉了他的学生斯蒂芬·罗素,斯蒂芬·罗素将eval函数在IBM 704机器上实现后,函数式编程的大门第一次向人类打开了。</p>
<p>2</p>
<p>第二天</p>
<p>这个平行宇宙的上帝思想独特,他说:“ 要有不变量”</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202006/2020617154412803.png?2020517154421" /></p>
<p>上帝又说: “函数应该是纯粹的(纯函数)”</p>
<p>不能修改传递给函数的变量!</p>
<p>不能修改全局变量!</p>
<p>对于同样的输入参数,返回值总是相同的!</p>
<p>下面的函数是被允许的,每次调用,返回值都相同,可以安全地调用,直到宇宙毁灭。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202006/2020617154450197.png?2020517154458" /></p>
<p>这样的函数在函数式宇宙中是不允许的,因为第二次调用就会导致函数式宇宙的毁灭。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202006/2020617154537016.png?2020517154549" /></p>
<p>这个函数是不被允许的,它竟然想修改输入参数!</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202006/2020617154622617.png?2020517154631" /></p>
<p>如果函数返回了一个新的数组,而没有改变原有的值,那函数式上帝很高兴。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202006/2020617154701103.png?2020517154718" /></p>
<p>人类对于上帝立下的规矩表示迷惑不解: are you kiding me ?</p>
<p>3</p>
<p>第三天</p>
<p>人类尝试着写程序,由于不变量的规定,发现连个最基本的for 循环都搞不定。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202006/2020617154746193.png?2020517154755" /></p>
<p>人类迷惑不解:“有没有搞错, 我们怎么写循环?”</p>
<p>上帝说:“你们用循环干什么?”</p>
<p>人类写了一段代码。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202006/2020617154829358.png?2020517154844" /></p>
<p>上帝说:要有递归!</p>
<p>上帝也写了一段代码:</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202006/2020617154905186.jpeg?2020517154925" /></p>
<p>人类说:“这虽然能完成工作,但是好像不太直观啊!再说,亲爱的上帝,如果我那个list容量很大,递归层次很深,会不会出现栈溢出?”</p>
<p>上帝说:“没事,我有尾递归,保证不溢出。这种递归的写法,你们慢慢就习惯了。”</p>
<p>4</p>
<p>第四天</p>
<p>上帝发现很多函数大体上都是相同的,只有部分细节不一样,有很多重复代码,太浪费了。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202006/2020617155025426.png?2020517155038" /></p>
<p>上帝说:“要有高阶函数!”</p>
<p>让函数来生成函数,把公用的部分抽取出来,不共用的部分与共用部分能组合起来。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202006/2020617155107782.png?2020517155115" /></p>
<p>上帝提供了几个很好用的高阶函数,如map,filter, fold等,让人类快速高效地去操作集合数据。</p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202006/2020617155141975.png?2020517155149" /></p>
<p>5</p>
<p>第五天</p>
<p>上帝对自己的工作很满意。仿佛程序世界的框架已经基本完成,只剩下边边角角的实现了。</p>
<p>可是这个宇宙的人类总是抱怨函数式编程太难,看到这里的上帝不愿意改变,有很多人都穿越到编号为S-87那个所谓“面向对象”的宇宙去了。</p>
<p>上帝叹了口气:“你们呐,目光短浅,摩尔定律已经失效,多核时代已经来临,我们函数式编程天生是为并发编程而生的啊,你看看函数没有side effect,不共享变量,可以安全地调度到任何一个CPU core上去运行,没有烦人的加锁问题,多好啊!”</p>
<p>过了两天,隔壁 S-87 宇宙的面向对象上帝来串门了。</p>
<p>面向对象上帝说:“亲爱的函数式上帝,听叛逃者,不,投诚者,啊,是穿越到我那里的人说,你这个宇宙有个叫做函数式编程的宝贝?”</p>
<p>函数式上帝:“还宝贝?!人都跑光了!”</p>
<p>“你给我讲讲吧,到时候我再劝他们回来。”</p>
<p>函数式上帝于是给他讲了自己创世纪时立下的规矩,还讲了很多他打算在第6天,第7天告诉人类的知识,什么Currying, 惰性求值,宏(macro)等等。</p>
<p>面向对象上帝表示感谢,喜滋滋地回去了。</p>
<p>后来,函数式上帝听说面向对象的宇宙出现了不少混合式风格编程的语言 OOP + FP (Functional Programming),也就没多少人再回到自己的宇宙了。</p>
<p>函数式上帝什么都没说,叹了口气。</p>
<p>6</p>
<p>第六天</p>
<p>函数式上帝决定休息。</p>
<p>7</p>
<p>第七天</p>
<p>函数式上帝继续休息。</p>
<p>这就是为什么函数式世界的程序员能休息两天的来历。</p>
<p>以上就是趣味函数式编程圣经 的详细内容,更多关于函数式编程的资料请关注琼殿技术社区其它相关文章!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>Scala函数式编程专题--函数思想介绍</li><li>JDK都出到14了,你有什么理由不会函数式编程(推荐)</li><li>JS中的一些常用的函数式编程术语</li><li>深入了解java 8的函数式编程</li><li>函数式编程入门实践(一)</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]