本文做者: Eric Elliott
编译:胡子大哈 javascript翻译原文:huziketang.com/blog/posts/…
英文链接:The Rise and Fall and Rise of Functional Programming (Composing Software)前端
转载请注明出处,保留原文连接以及做者信息java
本文是“组合式软件”系列的一篇文章,从头开始学习函数式编程和使用 JavaScript ES6+ 进行软件编程。请继续关注,后面还有不少相关内容。react
在我 6 岁的时候,我天天花不少时间和我最好的朋友一块儿打游戏,他们家里有不少电脑。对我来说它有种魔幻版不可抗拒的力量。有一天我忽然问我朋友:“咱们怎样才能本身作一个游戏呢?”编程
他也不知道,因此咱们一块儿去问他的爸爸,叔叔从很高的架子上拿下来一本书:Basic。我也由此开始了个人编程之旅。后来大学都有代数这门课程,而我对它已经很熟悉了,由于编程里面代数是基础,处处都是代数。数组
在计算机科学刚刚起步的时候,不少计算机科学的理论都尚未落地。那时候有两个伟大的计算机科学家:阿隆佐·丘奇和阿兰·图灵。他们创造了两个不一样的,可是具备同等效力的通用计算模型。两个模型均可以计算任何能够计算的东西(着重强调,“通用”)。浏览器
阿隆佐·丘奇发明了 λ 演算, λ 演算是基于函数应用的通用计算模型。阿兰·图灵则因图灵机而广为人知。图灵机定义了一个理论上的设备,它能够控制条带上的符号。他们合做证实了 λ 演算和图灵机是功能等价的。架构
λ 演算所有都是关于函数组合。函数组合在软件开发中是很是富有表现力和说服力的。本文中,咱们会讨论函数组合在软件设计中的重要性。app
这里有三点关于 λ 演算的特殊说明:编程语言
const sum = (x, y) => x + y
的右边是匿名函数,即 (x, y) => x + y
。(x, y) => x + y
能够表达为一个一元函数:x => y => x + y
。这种 n 元函数到一元函数的转化叫作柯里化。这些特征一块儿构成了简单且容易理解的规则,在组合式软件中使用函数做为主要编码单元。在 JavaScript 中,匿名函数和柯里化函数都是可选特征,也就是说 JavaScript 支持 λ 演算的主要特征可是并不强制使用。
经典的函数组合是把一个函数的输出做为另外一个函数的输入,例以下面的组合:
f·g复制代码
能够写成:
compose2 = f => g => x => f(g(x))复制代码
下面是如何使用它:
double = n => n * 2
inc = n => n + 1
compose2(double)(inc)(3)复制代码
compose2()
函数接受 double
函数做为第一个参数,inc
函数做为第二个参数,最后应用参数 3 到这两个函数组合上。再看一下 compose2()
的声明,f
是 double()
,g
是 inc()
,x
是 3
。函数调用 compose2(double)(inc)(3)
,其实是三个不一样的函数调用:
double
返回一个新函数 1;inc
为参数而且返回一个新函数 2;3
为参数而且计算 f(g(x))
,即 double(inc(3))
;x=3
传递给 inc()
;inc(3)
计算结果是 4
;double(4)
计算结果是 8
;8
。组合式软件的过程能够用函数组合图来表达,看下面代码:
append = s1 => s2 => s1 + s2
append('Hello, ')('world!')复制代码
能够用图来模拟表示:
λ 演算对软件设计的影响是深远的,直到大约 1980 年,计算机科学界不少有影响力的品牌,都是采用函数组合的方式来开发本身的软件。Lisp 是 1958 年发明的,它深受 λ 演算的影响。直到今天,Lisp 是依旧广为使用的第二大历史悠久的语言。
我是经过 AutoLISP 知道的 Lisp,AutoLISP 是在最流行的电脑辅助设计(CAD)软件——AutoCAD,中使用的脚本语言。AutoCAD 太流行了,使得其余全部的 CAD 应用几乎都支持 AutoLISP 以保持其兼容性。Lisp 依然可以在计算机科学课程中广为使用有三个主要缘由:
在 1970 到 1980 年期间,软件开发的方式开始发生变化,简单的组合式开发再也不受宠。出现了面向对象编程,它基于组件封装和信息传递的思想,在当时是很是先进的。代码经过继承来实现复用,继承关系是一种叫作 is-a
的关系。
函数式编程逐渐被边缘化,被抛弃到学术界和非主流的场外。在 1990 — 2010 年期间对三种人造成了甜蜜的困扰,一种是编程极客,一种是大学教授,一种是逃离了 Java 思想强制灌输的幸运的学生。而对于咱们来说,这 30 年的软件开发有一点噩梦般的感受,黑暗的年代。
2010 年左右,有个巨大的变化:JavaScript 爆发了。在 2006 年之前,JavaScript 一直被认为是一种玩具式的编程语言,能够在浏览器中作一些很可爱的动画,可是在这背后隐藏着潜力巨大的特色,即 λ 演算的重要特征。人们开始逐渐在私下里谈论“函数式编程”。
到 2015 年,用函数组合来开发软件从新开始流行起来。为了简化使用,JavaScript 规范也作了 10 年以来的首次重大升级,增长了箭头函数。箭头函数使建立和使用函数、柯里化和 λ 演算变得很容易。
箭头函数对于 JavaScript 函数式编程的爆发起到了推进剂的做用。如今不多看到那种不用函数式编程的大型应用了。
组合的方式能够简洁清晰地描述软件的行为,把一些小的、肯定性的函数组合成大的组件,进而造成软件,这样的软件很容易组织、理解、调试、扩展、测试和维护。
在读接下来文章的时候,但愿你能经过例子本身动手作实验。回想一下当本身仍是的孩子的时候,把一些东西拆开,本身再学着组装、拼接。从新找回童年探索事物的感受,但愿你能享受这个过程。
若是本文对你有帮助,欢迎关注个人专栏-前端大哈,按期发布高质量前端文章。
我最近正在写一本《React.js 小书》,对 React.js 感兴趣的童鞋,欢迎指点。