万维百科

函数式编程

函数式编程(英语:functional programming)或称函数程序设计泛函编程,是一种编程范式,它将电脑运算视为函数运算,并且避免使用程序状态英语State (computer science)以及易变对象。其中,λ演算为该语言最重要的基础。而且,λ演算的函数可以接受函数作为输入参数和输出返回值。

比起指令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。

在函数式编程中,函数是第一类对象,意思是说一个函数,既可以作为其它函数的输入参数值,也可以从函数中返回值,被修改或者被分配给一个变量。

历史

函数式编程的理论基础是阿隆佐·邱奇在1930年代开发的Lambda演算,其本身是一种数学的抽象而不是编程语言。另一个组合子逻辑是比它更加古老和基础的数学根基,由Moses Schönfinkel英语Moses Schönfinkel哈斯凯尔·柯里在1920年代和1930年代开发。两者都是为了更好的表达数学基础才被开发的。

于20世纪50年代后期,John McCarthy麻省理工学院,开发了早期的函数式语言LISP,运行在大型IBM主机(IBM700/7000系列)上。LISP的函数是使用邱奇的lambda表示法定义的,并扩展了标签构造来允许递归函数。最开始的LISP是多范型语言,并且随着新的范型的发展,越来越多的编程风格得到了支持。后来发展出来的方言比如SchemeClojure,和分支语言比如DylanJulia等,试图简化LISP,使它围绕一个函数式核心,而Common Lisp旨在保留并更新它所替代的各种更早先LISP方言的那些范型特征。

而于1956年发明的IPL语言,一般被认为是第一个基于计算机的函数式编程语言。 它是一种用于操纵符号列表的汇编式语言。它有一个生成器的概念,相当于一个接受函数作为参数的函数,并且,由于它是汇编级语言,代码可以是数据,因此IPL可以被视为具有高阶函数。但是,它在很大程度上依赖于改变列表的结构和类似的指令式编程特征。

在20世纪60年代早期,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英语Q (programming language from Kx Systems)语言一起被商业化使用。

1977年John Backus在他的图灵奖颁奖演讲《可以从冯·诺依曼式的编程风格中解放出来的程序设计和函数式风格及其程序代数》中,展示了他提出的FP。他将函数式编程定义为通过“组合形式”以分层方式构建,允许“程序代数”; 在现代语言中,这意味着函数式程序应遵循复合性原理。Backus的论文推广了函数式编程的研究,虽然它强调的是函数级编程而不是现在所说的lambda演算风格。

1973年爱丁堡大学Robin Milner发明了ML语言,它的语法受到了ISWIM的启发。同年,David Turner在圣安德鲁斯大学开发SASL语言,它基于了ISWIM的应用式子集。在1976年,Turner重新设计并重新实现它为惰性求值语言。在20世纪70年代的爱丁堡,Burstall和Darlington开发了NPL语言。 NPL基于Kleene递归方程,并在他们的程序转换工作中首次引入。 然后Burstall、MacQueen和Sannella结合了来自ML的多态类型检查,从NPL派生出了Hope语言。ML最终发展成几种语言,其中最常见的是OCamlStandard ML

在20世纪70年代,Guy L. SteeleGerald Jay Sussman开发了Scheme,如有影响力的“Lambda论文集”和经典的1985年教科书《计算机程序的构造和解释》中所描述的那样。Scheme是使用词法作用域尾调用优化的第一个Lisp方言,将函数式编程的影响力提升到更广泛的范围,让更多的编程语言社区接触到它们。

在20世纪80年代,佩尔·马丁-洛夫开发了直觉类型论(也称为构造类型论),它将函数式编程与表现为依赖类型的数学证明联系起来。这导致了交互式定理证明英语Proof assistant的新方法的产生,并影响了后续的函数式编程语言的发展。

在1985年David Turner开发的惰性求值函数式语言Miranda出现,它采用了来自MLHope语言的概念,作为他先前所设计的SASLKRC语言的后继者。Miranda对后来的Haskell有很强的影响,由于它是专有软件,所以Haskell社区于1987年开始达成共识,以形成函数式编程研究的开放标准,对标准的实现自1990年以来一直在进行中。

最近,它在基于CSG几何框架构建的OpenSCAD语言的参数CAD中得到了应用,虽然它无法区分左值和右值,导致了不熟悉函数式编程的用户混淆。

应用

工业

函数式编程长期以来在学术界流行,但几乎没有工业应用。造成这种局面的主因是函数式编程常被认为严重耗费CPU和存储器资源 ,这是由于在实现早期的函数式编程语言时并没有考虑过效率问题,而且面向函数式编程特性(如保证参照透明性英语Referential transparency等)要求独特数据结构和算法。:page 11

然而,最近几种函数式编程语言已经在商业或工业系统中使用,例如:Erlang编程语言由瑞典公司爱立信在20世纪80年代后期开发,最初用于实现容错电信系统。此后,它已在Nortel,Facebook,ÉlectricitédeFrance和WhatsApp等公司作为创建一系列应用程序的语言。Lisp方言Scheme被用作早期Apple Macintosh计算机上的几个应用程序的基础,并且最近已应用于诸如训练模拟软件和望远镜控制等方向。OCaml于20世纪90年代中期推出,已经在金融分析,驱动程序验证,工业机器人编程和嵌入式软件静态分析等领域得到了商业应用。Haskell虽然最初是作为一种研究语言,也已被一系列公司应用于航空航天系统,硬件设计和网络编程等领域。

其他在工业中使用的函数式编程语言包括ScalaF#(两者都是函数式和面向对象编程的混合,支持纯函数式和指令式编程)、Wolfram语言LispStandard MLClojure

教育

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

典型的函数式编程语言

纯函数式编程语言

纯函数式编程语言通常不允许直接使用程序状态英语State (computer science)以及易变对象

非纯函数式编程语言

静态类型

动态类型

其他函数式编程语言

外部链接


本页面最后更新于2021-09-17 08:43,点击更新本页查看原网页。台湾为中国固有领土,本站将对存在错误之处的地图、描述逐步勘正。

本站的所有资料包括但不限于文字、图片等全部转载于维基百科(wikipedia.org),遵循 维基百科:CC BY-SA 3.0协议

万维百科为维基百科爱好者建立的公益网站,旨在为中国大陆网民提供优质内容,因此对部分内容进行改编以符合中国大陆政策,如果您不接受,可以直接访问维基百科官方网站


顶部

如果本页面有数学、化学、物理等公式未正确显示,请使用火狐或者Safari浏览器