函数式编程

函数式编程，或称函数程序设计、泛函编程（Functional programming），是一种编程范型，它将电脑运算视为函数运算，并且避免使用程式状态以及可变物件。

**简介**
在函数式编程中，函数是头等对象即头等函数，这意味着一个函数，既可以作为其它函数的输入参数值，也可以从函数中返回值，被修改或者被分配给一个变量。λ演算是这种范型最重要的基础，λ演算的函数可以接受函数作为输入参数和输出返回值。
比起指令式编程，函数式编程更加强调程序执行的结果而非执行的过程，倡导利用若干简单的执行单元让计算结果不断渐进，逐层推导复杂的运算，而不是设计一个复杂的执行过程。

**历史**
阿隆佐·邱奇在1930年代开发的λ演算cite web|url=https://www.semanticscholar.org/paper/The-calculi-of-lambda-conversion-Church/9c6e618fe404c84ecb2fcca1dba505e040460f51|title=The Calculi of Lambda-Conversion|author=Alonzo Church|year=1941|publisher=Annals of Mathematics studies, no. 6. Lithoprinted. Princeton University Press, Princeton|access-date=2021-09-24|archive-date=2022-05-19|archive-url=https://web.archive.org/web/20220519064303/https://www.semanticscholar.org/paper/The-calculi-of-lambda-conversion-Church/9c6e618fe404c84ecb2fcca1dba505e040460f51，是建造自Function application的一种计算形式系统。在1937年，艾伦·图灵证明了λ演算和图灵机是等价的计算模型，展示了λ演算是图灵完备性的。λ演算形成了所有函数式编程语言的基础。另一种等价的理论公式化是组合子逻辑，它由Moses Schönfinkel和哈斯凯尔·柯里在1920年代和1930年代开发。
邱奇后来又开发了简单类型λ演算，它通过向所有的项指定一个类型而扩展了λ演算。这个系统形成了静态类型函数式编程的基础。
于20世纪50年代后期，John McCarthy在麻省理工学院，开发了早期的函数式语言LISP，运行在大型IBM主机（IBM 700/7000 series）上。LISP的函数定义借鉴了邱奇的λ表示法，并扩展了标签构造来允许递归函数
。最开始的LISP是多范型语言，并且随着新的范型的发展，越来越多的编程风格得到了支持。后来发展出来的方言比如Scheme、Clojure，和分支语言比如Dylan等，试图围绕一个清晰的函数式核心，来得出简化和理性化的LISP，而Common Lisp旨在保留并更新它所替代的各种更早先LISP方言的那些范型特征。
而于1956年发明的IPL语言，一般被认为是第一个基于计算机的函数式编程语言。 它是一种用于操纵符号列表的汇编式语言。它有一个生成器的概念，相当于一个接受函数作为参数的函数，并且，由于它是汇编级语言，代码可以是数据，因此IPL可以被视为具有高阶函数。但是，它在很大程度上依赖于改变列表的结构和类似的指令式编程特征。
在1960年代早期，Kenneth E. Iverson开发了APL语言，在他1962年出版的《A Programming Language》一书中对其有所介绍。APL对John Backus的FP语言施加了巨大的影响。在20世纪90年代早期，Iverson和Roger Hui创造了J语言。在20世纪90年代中期，以前曾与Iverson合作过的Arthur Whitney创建了K语言，后者在金融行业中与其衍生出来的Q语言一起被商业化使用。
1977年John Backus在他的图灵奖颁奖演讲《编程可以从冯·诺依曼式风格中解放出来吗？一种函数式风格及其程序代数》中，展示了他提出的FP。他将函数式编程定义为通过“组合形式”以分层方式构建，允许“程序代数”; 在现代语言中，这意味着函数式程序应遵循复合性原理。Backus的论文推广了函数式编程的研究，虽然它强调的是函数级编程而不是现在所说的λ演算风格。
1973年爱丁堡大学的Robin Milner发明了ML语言，它的语法受到了ISWIM的启发。同年，David Turner在圣安德鲁斯大学开发了SASL语言，它基于了ISWIM的应用式子集。在1976年，Turner重新设计并重新实现它为惰性求值语言。在20世纪70年代的爱丁堡，Rod Burstall和John Darlington开发了NPL语言。 NPL基于Kleene的递归方程，并在他们的程序转换工作中首次引入。 然后Rod Burstall、David MacQueen和Don Sannella结合了来自ML的多态类型检查，从NPL派生出了Hope语言。ML最终发展成几种语言，其中最常见的是OCaml和Standard ML。
在1970年代，Guy L. Steele和Gerald Jay Sussman开发了Scheme，如有影响力的“λ论文集”和经典的1985年教科书《计算机程序的构造和解释》中所描述的那样。Scheme是使用词法作用域和尾调用优化的第一个Lisp方言，将函数式编程的影响力提升到更广泛的范围，让更多的编程语言社区接触到它们。
在1980年代，佩尔·马丁-洛夫开发了直觉类型论（也称为构造类型论），它将函数式编程与表现为依赖类型的数学证明联系起来。这导致了Proof assistant的新方法的产生，并影响了后续的函数式编程语言的发展。
在1985年David Turner开发的惰性求值函数式语言Miranda出现，它采用了来自ML与Hope语言的概念，作为他先前所设计的SASL和KRC语言的后继者。Miranda对后来的Haskell有很强的影响，由于它当时是专有软件，所以Haskell社区于1987年开始达成共识，以形成函数式编程研究的开放标准，对标准的实现自1990年以来一直在进行中。
最近，它在基于CSG几何框架构建的OpenSCAD语言的参数CAD中得到了应用，虽然在重新赋值上的限制（所有值都被当作常量），导致了不熟悉函数式编程的用户混淆。

**应用**

**工业**
函数式编程长期以来在学术界流行，但几乎没有工业应用。造成这种局面的主因是函数式编程常被认为严重耗费CPU和记忆体资源 ，这是由于在早期实现函数式编程语言时并没有考虑过效率问题，而且面向函数式编程特性，如保证Referential transparency等，要求独特的数据结构和算法。
然而，最近几种函数式编程语言已经在商业或工业系统中使用，例如：
*Erlang，它由瑞典公司爱立信在20世纪80年代后期开发，最初用于实现容错电信系统。此后，它已在Nortel、Facebook、Électricité de France和WhatsApp等公司作为流行语言建立一系列应用程序。
*Scheme，它被用作早期Apple Macintosh计算机上的几个应用程序的基础，并且最近已应用于诸如训练模拟软件和望远镜控制等方向。
*OCaml，它于20世纪90年代中期推出，已经在金融分析，驱动程序验证，工业机器人编程和嵌入式软件静态分析等领域得到了商业应用。
*Haskell，它虽然最初是作为一种研究语言，也已被一系列公司应用于航空航天系统，硬件设计和网络编程等领域。
其他在工业中使用的函数式编程语言包括多范型的Scala、F#，还有Wolfram语言、Common Lisp、Standard ML和Clojure等。

**教育**
教育方面，函数式编程一直受到了很大的重视，很多学校使用函数式编程来教授算法和几何的相关概念。

**典型的函数式编程语言**
纯函数式编程语言通常不允许直接使用程式状态以及可变对象，典型语言有：Miranda、Haskell和Idris等。
非纯函数式编程语言可按类型系统分为两类：
*静态类型语言：ML家族的Standard ML、OCaml、F#，还有Scala、Typed Racket等。
*动态类型语言：Lisp家族的Scheme、Common Lisp、Clojure、Racket，还有LOGO、Erlang、Wolfram语言和R等。
此外，支持隐式编程风格的函数式编程语言有：APL/J和jq等。

**参考文献**

**外部连结**
  Why Functional Programming Matters date=20201112023406