函数式编程的兴衰与当前之兴起

《函数式编程的兴衰与当前之兴起》

本文作者: Eric Elliott
编译:胡子大哈

翻译原文:http://huziketang.com/blog/posts/detail?postId=58e3062ba58c240ae35bb8de
英文衔接:The Rise and Fall and Rise of Functional Programming (Composing Software)

转载请申明出处,保存原文链接以及作者信息

本文是“组合式软件”系列的一篇文章,从头最先进修函数式编程和运用 JavaScript ES6+ 举行软件编程。请继续关注,背面另有许多相关内容。

在我 6 岁的时刻,我每天花许多时候和我最好的朋侪一同打游戏,他们家里有许多电脑。对我来说它有种魔幻版不可抗拒的气力。有一天我倏忽问我朋侪:“我们怎样才能本身做一个游戏呢?”

他也不晓得,所以我们一同去问他的爸爸,叔叔从很高的架子上拿下来一本书:Basic。我也由此最先了我的编程之旅。厥后大学都有代数这门课程,而我对它已很熟悉了,由于编程内里代数是基础,随处都是代数。

组合式软件的鼓起

在盘算机科学方才起步的时刻,许多盘算机科学的理论都还没有落地。那时刻有两个庞大的盘算机科学家:阿隆佐·丘奇和阿兰·图灵。他们制造了两个差别的,然则具有一致效能的通用盘算模子。两个模子都可以盘算任何可以盘算的东西(着重强调,“通用”)。

阿隆佐·丘奇发清楚明了 λ 演算, λ 演算是基于函数运用的通用盘算模子。阿兰·图灵则因图灵机而广为人知。图灵机定义了一个理论上的装备,它可以掌握条带上的标记。他们协作证清楚明了 λ 演算和图灵机是功用等价的。

λ 演算全部都是关于函数组合。函数组合在软件开辟中是异常富有表现力和说服力的。本文中,我们会议论函数组合在软件设计中的主要性。

这里有三点关于 λ 演算的特别申明:

  1. 函数通常是匿名的。在 JavaScript 中,const sum = (x, y) => x + y 的右侧是匿名函数,即 (x, y) => x + y

  2. λ 演算中的函数只接收单一输入,它是一元的。假如你须要通报多参数,函数会接收第一个输入而且返回一个新的函数来接收第二个参数,以此类推。一个 n 元函数 (x, y) => x + y 可以表达为一个一元函数:x => y => x + y。这类 n 元函数到一元函数的转化叫做柯里化。

  3. 函数是一级的。意义是说一个函数可以作为另一个函数的输入,而且一个函数可以返回另一个函数。

这些特性一同构成了简朴且轻易明白的划定规矩,在组合式软件中运用函数作为主要编码单位。在 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() 的声明,fdouble()ginc()x3。函数挪用 compose2(double)(inc)(3),实际上是三个差别的函数挪用:

  1. 起首通报 double 返回一个新函数 1;

  2. 新函数 1 以 inc 为参数而且返回一个新函数 2;

  3. 新函数 2 以 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!')

可以用图来模仿示意:

《函数式编程的兴衰与当前之兴起》

λ 演算对软件设计的影响是深远的,直到约莫 1980 年,盘算机科学界许多有影响力的品牌,都是采纳函数组合的体式格局来开辟本身的软件。Lisp 是 1958 年发现的,它深受 λ 演算的影响。直到本日,Lisp 是照旧广为运用的第二大历史悠久的言语。

我是经由过程 AutoLISP 晓得的 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 一向被认为是一种玩具式的编程言语,可以在浏览器中做一些很可爱的动画,然则在这背地隐藏着潜力庞大的特性,即 λ 演算的主要特性。人们最先逐步在私下里议论“函数式编程”。

到 2015 年,用函数组合来开辟软件从新最先盛行起来。为了简化运用,JavaScript 范例也做了 10 年以来的初次严重晋级,增加了箭头函数。箭头函数使创建和运用函数、柯里化和 λ 演算变得很轻易。

箭头函数关于 JavaScript 函数式编程的迸发起到了推进剂的作用。如今很少看到那种不必函数式编程的大型运用了。

组合的体式格局可以简约清楚地形貌软件的行动,把一些小的、确定性的函数组合成大的组件,进而构成软件,如许的软件很轻易构造、明白、调试、扩大、测试和保护。

在读接下来文章的时刻,愿望你能经由过程例子本身动手做试验。追念一下当本身照样的孩子的时刻,把一些东西拆开,本身再学着组装、拼接。从新找回童年探究事物的觉得,愿望你能享用这个历程。

假如本文对你有协助,迎接关注我的专栏-前端大哈,按期宣布高质量前端文章。

我近来正在写一本《React.js 小书》,对 React.js 感兴趣的童鞋,迎接指导

    原文作者:胡子大哈
    原文地址: https://segmentfault.com/a/1190000009036864
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞