烟雾的方块艺术 —MattysFlicks —(CC BY 2.0)javascript
注意:这是从基础学习函数式编程和使用 JavaScript ES6+ 编写软件的第一部分。保持关注,接下来还有不少!前端
当我 6 岁时,我花了不少时间跟个人小伙伴玩电脑游戏,他家有一个装满电脑的房间。对于我说,它们有不可抗拒的魔力。我花了不少时间探索全部的游戏。一天我问他,“咱们怎样作一个游戏?”java
他不知道,因此咱们问了他的老爸,他的老爸爬上一个很高的架子拿下来一本使用 Basic 编写游戏的书籍。就那样开始了个人编程之路。当公立学校开始教授代数时,我已经熟稔其中的概念了,由于编程基本上是代数。不管如何,它都是。react
在计算机科学的起步阶段,在大多数的计算机科学在电脑上完成以前,有两位伟大的计算机科学家:阿隆佐·邱奇和艾伦·图灵。他们发明了两种不一样、可是广泛通用的计算模型。两种均可以计算全部可被计算的东西(所以,“广泛”)。android
阿隆佐·邱奇发明了 lambda 表达式。lambda 表达式是基于函数应用的通用计算模型。艾伦·图灵由于图灵机而知名。图灵机使用定义一个在磁带上操做符号的理论装置来计算的通用模型。ios
总的说,他们共同说明了 lambda 表达式和图灵机功能上是相等的。git
lambda 表达式全是函数组成,依靠函数来编写软件是很是高效和有意义的。本文中,咱们将会讨论软件设计中函数的组合的重要性。github
有三点造就了 lambda 表达式的特别之处:编程
const sum = (x, y) => x + y
的右侧,能够看做一个匿名函数表达式 (x, y) => x + y
。(x, y) => x + y
能够被表示为一个像 x => y => x + y
的一元函数。这个把多元函数转换成一元函数的过程叫作柯里化。总的说来,这些特性造成一个简单且具备表达性的方法来构造软件,即便用函数做为初始模块。在 JavaScript 中,函数的匿名和柯里化都是可选的特性。虽然 JavaScript 支持这些 lambda 表达式的重要属性,它却并不强制使用这些。后端
这些经典的函数组合方法用一个函数的输出来做为另外一个函数的输入,例如,对于组合:
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
同时返回一个新的函数。inc
同时再返回一个新的函数。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!')复制代码
你能够想象成这样:
lambda 表达式对软件设计产生了很大的影响,在 1980 年以前,计算机科学领域不少有影响的东西使用函数来构造软件。Lisp 在 1958 年被创做出来,很大程度上受到了 lambda 表达式的影响。现在,Lisp 是普遍使用的第二老的语言了。
我经过 AutoLISP:一个做为脚本语言被用于最流行的计算机辅助设计(CAD)软件:AutoCAD,接触到它。AutoCAD 很流行,实际上全部其余的 CAD 软件都兼容支持 AutoLISP。Lisp 由于如下三点缘由被普遍做为计算机科学的课程:
在 1970 到 1980 中间的某段时间,软件的构造开始偏离简单的组合,成为一串线性的让计算机执行的指令。而后面向对象编程 — 一个伟大的关于组件的封装和信息传递的思想被流行的编程语言扭曲了,变成为了特性的重用所采起的糟糕的继承层次和 is-a 关系。
函数式编程语言退居二线:只有编程极客的痴迷、常春藤盟校的教授和一些幸运的学生能够在 1990 — 2010 年间逃离 Java 的强迫性学习。
对于咱们的大多数人来讲,已经经历了大约 30 年的软件编写噩梦和黑暗时期。
在 2010 年左右,一些有趣的事情发生了:JavaScript 的崛起。在大概 2006 年之前,JavaScript 被普遍的看做玩具语言和被用制做浏览器中好玩的动画,可是它里面隐藏着一些极其强大的特性。即 lambda 表达式中最重要的特性。人们开始暗中讨论一个叫作 “函数式编程的” 酷东西。
我一直在告诉你们 #JavaScript 并非一门玩具语言。如今我须要展现它。
在 2015 年,使用函数的组合来编写软件又开始流行起来。为了更简单化,JavaScript 规范得到的数十年来第一次主要的更新而且添加了箭头函数,为了更简单的编写和读取函数、柯里化,和 lambda 语句。
箭头函数像是 JavaScript 函数式编程飞升的燃料。如今不多看见不使用不少函数式编程技术的大型应用了。
组合型能够简单、优雅的表达软件的模型和行为。经过把小的、肯定的函数组合成稍大的组件并构成软件的过程,能够更为简单的组织、理解、调试、扩展、测试和掌控。
你在阅读下一部分时,可使用实例实验,记住要把你本身当孩子同样把其余的思想扔在一边在学习中去探索和玩耍。从新发现孩童时发现新事物的欣喜。让咱们来作一些魔术吧。
接下来的第二部分:“为何要用 JavaScript 学习函数式编程?”
想更多的学习 JavaScript 的函数式编程?
Learn JavaScript with Eric Elliott,什么,你尚未参加,out 了!
Eric Elliott 是 “Programming JavaScript Applications” (O’Reilly) 和 “Learn JavaScript with Eric Elliott” 的做者。他曾效力于 Adobe Systems, Zumba Fitness, he Wall Street Journal, ESPN, BBC, and top recording artists including Usher, Frank Ocean, Metallica 和其余一些公司。
他和她的老婆(很漂亮)大部分时间都在旧金山湾区里。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、React、前端、后端、产品、设计 等领域,想要查看更多优质译文请持续关注 掘金翻译计划。