[译]跌宕起伏的函数式编程(软件编写)(第一部分)-阿里云开发者社区

开发者社区> 玄学酱> 正文

[译]跌宕起伏的函数式编程(软件编写)(第一部分)

简介: 本文讲的是[译]跌宕起伏的函数式编程(软件编写)(第一部分),当我 6 岁时,我花了很多时间跟我的小伙伴玩电脑游戏,他家有一个装满电脑的房间。对于我说,它们有不可抗拒的魔力。我花了很多时间探索所有的游戏。一天我问他,“我们怎样做一个游戏?”
+关注继续查看
本文讲的是[译]跌宕起伏的函数式编程(软件编写)(第一部分),

烟雾的方块艺术 —MattysFlicks —(CC BY 2.0)

注意:这是从基础学习函数式编程和使用 JavaScript ES6+ 编写软件的第一部分。保持关注,接下来还有很多!

当我 6 岁时,我花了很多时间跟我的小伙伴玩电脑游戏,他家有一个装满电脑的房间。对于我说,它们有不可抗拒的魔力。我花了很多时间探索所有的游戏。一天我问他,“我们怎样做一个游戏?”

他不知道,所以我们问了他的老爸,他的老爸爬上一个很高的架子拿下来一本使用 Basic 编写游戏的书籍。就那样开始了我的编程之路。当公立学校开始教授代数时,我已经熟稔其中的概念了,因为编程基本上是代数。无论如何,它都是。

组合型软件的兴起

在计算机科学的起步阶段,在大多数的计算机科学在电脑上完成之前,有两位伟大的计算机科学家:阿隆佐·邱奇和艾伦·图灵。他们发明了两种不同、但是普遍通用的计算模型。两种都可以计算所有可被计算的东西(因此,“普遍”)。

阿隆佐·邱奇发明了 lambda 表达式。lambda 表达式是基于函数应用的通用计算模型。艾伦·图灵因为图灵机而知名。图灵机使用定义一个在磁带上操作符号的理论装置来计算的通用模型。

总的说,他们共同说明了 lambda 表达式和图灵机功能上是相等的。

lambda 表达式全是函数组成,依靠函数来编写软件是非常高效和有意义的。本文中,我们将会讨论软件设计中函数的组合的重要性。

有三点造就了 lambda 表达式的特别之处:

  1. 函数都是匿名的,在 JavaScript 中,表达式 const sum = (x, y) => x + y 的右侧,可以看作一个匿名函数表达式 (x, y) => x + y
  2. lambda 表达式中的函数只接收一个参数。他们是一元的,如果你需要多个参数,函数将会接受一个输入返回一个调用下一个函数的函数,然后继续这样。非一元函数 (x, y) => x + y 可以被表示为一个像 x => y => x + y 的一元函数。这个把多元函数转换成一元函数的过程叫做柯里化。
  3. 函数是一等公民的,意味着函数可以作为参数传递给其他函数,同时函数可以返回函数。

总的说来,这些特性形成一个简单且具有表达性的方法来构造软件,即使用函数作为初始模块。在 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) 的调用,实际上是三个不同函数的调用:

  1. 首先传入 double 同时返回一个新的函数。
  2. 返回的函数传入 inc 同时再返回一个新的函数。
  3. 再返回的函数传入 3 同时计算 f(g(x)),最后实际上是 double(inc(3))
  4. x 等于 3 同时传给 inc()
  5. inc(3) 等于 4
  6. double(4) 等于 8
  7. 函数返回 8

组合软件时,可以被看作一个由函数组合的图。看一下下面:

append = s1 => s2 => s1 + s2
append('Hello, ')('world!')

你可以想象成这样:

1*LSXnRbKzQ4yhq1fjZjvq6Q.png

lambda 表达式对软件设计产生了很大的影响,在 1980 年之前,计算机科学领域很多有影响的东西使用函数来构造软件。Lisp 在 1958 年被创作出来,很大程度上受到了 lambda 表达式的影响。如今,Lisp 是广泛使用的第二老的语言了。

我通过 AutoLISP:一个作为脚本语言被用于最流行的计算机辅助设计(CAD)软件:AutoCAD,接触到它。AutoCAD 很流行,实际上所有其他的 CAD 软件都兼容支持 AutoLISP。Lisp 因为以下三点原因被广泛作为计算机科学的课程:

  1. 可以很容易的在一天左右学习 Lisp 基础的词法和语法。
  2. Lisp 全是由函数组成,函数组合是构造应用非常优雅的方式。
  3. 我知道的使用 Lisp 的最棒的计算机科学书籍:计算机程序的结构与解释

组合型软件的衰落

在 1970 到 1980 中间的某段时间,软件的构造开始偏离简单的组合,成为一串线性的让计算机执行的指令。然后面向对象编程 — 一个伟大的关于组件的封装和信息传递的思想被流行的编程语言扭曲了,变成为了特性的重用所采取的糟糕的继承层次和 is-a 关系。

函数式编程语言退居二线:只有编程极客的痴迷、常春藤盟校的教授和一些幸运的学生可以在 1990 — 2010 年间逃离 Java 的强迫性学习。

对于我们的大多数人来说,已经经历了大约 30 年的软件编写噩梦和黑暗时期。

组合型软件的兴起

在 2010 年左右,一些有趣的事情发生了:JavaScript 的崛起。在大概 2006 年以前,JavaScript 被广泛的看作玩具语言和被用制作浏览器中好玩的动画,但是它里面隐藏着一些极其强大的特性。即 lambda 表达式中最重要的特性。人们开始暗中讨论一个叫做 “函数式编程的” 酷东西。

1

我一直在告诉大家 #JavaScript 并不是一门玩具语言。现在我需要展示它。

在 2015 年,使用函数的组合来编写软件又开始流行起来。为了更简单化,JavaScript 规范获得的数十年来第一次主要的更新并且添加了箭头函数,为了更简单的编写和读取函数、柯里化,和 lambda 语句。

箭头函数像是 JavaScript 函数式编程飞升的燃料。现在很少看见不使用很多函数式编程技术的大型应用了。

组合型可以简单、优雅的表达软件的模型和行为。通过把小的、确定的函数组合成稍大的组件并构成软件的过程,可以更为简单的组织、理解、调试、扩展、测试和掌控。

你在阅读下一部分时,可以使用实例实验,记住要把你自己当孩子一样把其他的思想扔在一边在学习中去探索和玩耍。重新发现孩童时发现新事物的欣喜。让我们来做一些魔术吧。





原文发布时间为:2017年4月14日

本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10062 0
某软件大赛编程题(转)
某软件大赛C#版考题整理——【单选题】 可以先自己做做,答案在最下面~~   一、单选题(10小题共20.0分) 1. 以下JavaScript代码的正确输出结果是:()。 1 2 3 4 5 6 7 8 9 i = 1; function fun1(){     window.
677 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12070 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13875 0
让你提前认识软件开发(46):首先是为人编写程序,其次才是计算机
第3部分 软件研发工作总结 首先是为人编写程序,其次才是计算机          “首先是为人编写程序,其次才是计算机”,这是软件开发的基本要点,软件的生命周期贯穿于产品的开发、测试、生产、发布、用户使用、版本升级和后期维护等长期过程中,只有易读、易维护的软件代码才具有生命力。
1021 0
javac选项以递归方式编译给定目录下的所有Java文件 - IT屋-程序员软件开发技术分享社区
http://www.it1352.com/539276.html #Linux $ find -name“* .java”> sources.txt $ javac @ sources.txt :: Windows > dir / s / B * .java> sources.txt > javac @ sources.txt  网名:浩秦; 邮箱:root#landv.pw; 只要我能控制一個國家的貨幣發行,我不在乎誰制定法律。
986 0
梅宏院士:软件定义的未来——万物皆可互联,一切均可编程 | CNCC 2017
本文讲的是梅宏院士:软件定义的未来——万物皆可互联,一切均可编程 | CNCC 2017,10月26日上午8:30,由中国计算机学会(CCF)主办,福州市人民政府、福州大学承办,福建师范大学、福建工程学院协办的2017中国计算机大会(CNCC 2017)在福州海峡国际会展中心如期隆重召开。
1494 0
+关注
玄学酱
这个时候,玄酱是不是应该说点什么...
20710
文章
438
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载