• 函数(函数的分类)


    函数式编程[编辑]

    维基百科,自由的百科全书
     
     
     
    跳到导航跳到搜索

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

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

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

    历史[编辑]

    函数式编程的理论基础是Lambda演算,其本身是一种数学的抽象但不是编程语言。另一个组合逻辑是比它更加古老和基础的数学根基。两者都是为了更好的表达数学基础才被开发的。[1]

    早期的函数式语言例如Lisp,是由 John McCarthy在麻省理工学院,于20世纪50年代后期开发的,运行在大型IBM机(IBM 700/7000系列)上。[2]Lisp最早引入了函数式的很多特性,最开始的lisp是多范式语言,并且随着新的范式的发展,越来越多的编程风格得到了支持。后来分支出来的语言,例如SchemeClojure ,DylanJulia等分支,试图简化Lisp,使它围绕一个功能核心,而Common Lisp旨在保留lisp的原始范式特征。[3]

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

    Kenneth E. Iverson在20世纪60年代早期开发了APL ,在他1962年出版的《A Programming Language》[5]一书中有介绍。 APL给John Backus的FP提供了巨大的影响。 在20世纪90年代早期,Iverson和Roger Hui创造了J语言。 在20世纪90年代中期,以前曾与Iverson合作过的Arthur Whitney创建了K语言,后者在金融行业中与其派生出来的Q语言一起被商业化使用。

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

    1973年ML语言由爱丁堡大学的 Robin Milner发明。同年,David Turner在圣安德鲁斯大学开发SASL语言。在20世纪70年代的爱丁堡,Burstall和Darlington开发了NPL语言。[7] NPL基于Kleene递归方程 ,并在他们的程序转换工作中首次引入。[8] 然后Burstall,MacQueen和Sannella将ML的多态类型检查结合起来,产生了Hope语言。[9]ML最终发展成几种语言,其中最常见的是OCamlStandard ML。 同时,如有影响力的Lambda paper和经典的1985年教科书《Structure and Interpretation of Computer Programs》中所描述的,Scheme的发展,Lisp的功能子集和不完全的函数式语言分支,将函数式编程的影响力提升到更广泛的范围,让更多的编程语言社区接触到它们。

    在20世纪80年代, Per Martin-Löf开发了直觉类型论(也称为构造类型论),它将函数式编程与表现为类型依赖的数学证明联系起来。这导致了交互式定理证明的新方法的产生,并影响了后续的函数式编程语言的发展。 David Turner开发的惰性求值函数式语言Miranda最初出现在1985年,对后来的Haskell有很强的影响。 由于Miranda是非公开的语言,所以Haskell社区于1987年开始达成共识,以形成函数式编程研究的开放标准,对标准的实现自1990年以来一直在进行中。

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

    函数式编程更加现代一些的例子包括CleanClojureErlangHaskellMirandaScheme等。

    应用[编辑]

    工业[编辑]

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

    其他在工业中使用的函数式编程语言包括Scala[15]F#(两者都是功能性面对对象编程的混合,支持纯函数和命令式编程)、Wolfram语言LispStandard MLClojure

    教育[编辑]

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

    速度和空间上的顾虑[编辑]

    函数式编程常被认为严重耗费CPU和存储器资源[17] 。主因有二:

    • 在实现早期的函数式编程语言时并没有考虑过效率问题。
    • 面向函数式编程特性(如保证函数参数不变性等)的独特数据结构和算法。

    典型的函数式编程语言[编辑]

    纯函数式编程语言[编辑]

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

    强静态类型

    弱类型

    非纯函数式编程语言[编辑]

    强静态类型

    静态类型

    强动态类型

    弱类型

    其他函数式编程语言[编辑]

    参考文献[编辑]

    1. ^ Haskell Brooks Curry; Robert Feys. Combinatory Logic. North-Holland Publishing Company. 1958 [10 February 2013]. (原始内容存档于2020-04-09).
    2. ^ McCarthy, JohnHistory of Lisp. In ACM/SIGPLAN History of Programming Languages Conference. June 1978: 217–223 [2019-05-12]. doi:10.1145/800025.808387. (原始内容存档于2008-06-07).
    3. ^ Guy L. Steele; Richard P. Gabriel. The Evolution of Lisp (PDF). In ACM/SIGPLAN Second History of Programming Languages. February 1996: 233–330 [2019-05-12]. ISBN 978-0-201-89502-5doi:10.1145/234286.1057818. (原始内容存档 (PDF)于2020-11-12).
    4. ^ The memoir of Herbert A. Simon (1991), Models of My Life pp.189-190 ISBN 0-465-04640-1 claims that he, Al Newell, and Cliff Shaw are "...commonly adjudged to be the parents of [the] artificial intelligence [field]," for writing Logic Theorist, a program that proved theorems from Principia Mathematica automatically. To accomplish this, they had to invent a language and a paradigm that, viewed retrospectively, embeds functional programming.
    5. ^ ISBN 9780471430148
    6. ^ Can Programming Be Liberated from the von Neumann Style? A Functional Style and Its Algebra of Programs (PDF). [2019-05-12]. (原始内容存档 (PDF)于2020-11-08).
    7. ^ R.M. Burstall. Design considerations for a functional programming language. Invited paper, Proc. Infotech State of the Art Conf. "The Software Revolution", Copenhagen, 45–57 (1977)
    8. ^ R.M. Burstall and J. Darlington. A transformation system for developing recursive programs. Journal of the Association for Computing Machinery 24(1):44–67 (1977)
    9. ^ R.M. Burstall, D.B. MacQueen and D.T. Sannella. HOPE: an experimental applicative language. Proc. 1980 LISP Conference, Stanford, 136–143 (1980).
    10. ^ Make discovering assign() easier!. OpenSCAD. [2019-05-12]. (原始内容存档于2020-09-28).
    11. ^ Odersky, Martin; Spoon, Lex; Venners, Bill. Programming in Scala: A Comprehensive Step-by-step Guide 2nd. Artima. December 13, 2010: 883/852 [2019-05-12]. ISBN 978-0-9815316-4-9. (原始内容存档于2016-04-30).
    12. ^ Ray, Baishakhi; Posnett, Daryl; Devanbu, Premkumar; Filkov, Vladimir. A large-scale study of programming languages and code quality in GitHub. Communications of the ACM. 2017-09-25, 60 (10): 92. doi:10.1145/3126905 (英语).
    13. ^ Piro, Christopher. Functional Programming at Facebook. CUFP 2009. 2009 [2009-08-29]. (原始内容存档于2009-10-17).
    14. ^ 1 million is so 2011 页面存档备份,存于互联网档案馆 // WhatsApp blog, 2012-01-06: "the last important piece of our infrastracture is Erlang"
    15. ^ Momtahan, Lee. Scala at EDF Trading: Implementing a Domain-Specific Language for Derivative Pricing with Scala. CUFP 2009. 2009 [2009-08-29]. (原始内容存档于2009-10-17).
    16. ^ Emmanuel Schanzer of BootstrapTWiT.tv上的节目《Triangulation》的采访(英文)
    17. ^ Larry C. Paulson. ML for the Working Programmer. Cambridge University Press. 28 June 1996 [10 February 2013]. ISBN 978-0-521-56543-1. (原始内容存档于2020-04-09).

    外部链接[编辑]

     
  • 相关阅读:
    #333 Div2 Problem B Approximating a Constant Range(尺取法)
    苦逼的单身狗(玄乎的尺取大法)
    欧拉项目第四题之三位数之积数的最大回数
    欧拉项目第三题之最大质数因子
    关于尺取法的认识与简单例题
    codeforces 980B Marlin
    康托展开和逆康托展开
    Chrome控制台中Network的Preview与Response区别
    配置Express中间件
    Express中间件简介
  • 原文地址:https://www.cnblogs.com/linyinmobayu/p/14260924.html
Copyright © 2020-2023  润新知