历史

  Lambda演算为描述函数及其评估提供了理论框架。它是一种数学抽象而不是编程语言 - 但它构成了几乎所有当前函数式编程语言的基础。等效的理论公式,组合逻辑,通常被认为比lambda演算更抽象,并且在发明之前。组合逻辑和lambda演算最初都是为了更清晰地接近数学基础而开发的

一种早期功能性语言是Lisp,它是由John McCarthy麻省理工学院(MIT)于20世纪50年代后期开发的IBM 700/7000系列科学计算机。 Lisp首先介绍了函数式编程的许多范式特性,尽管早期的Lisp是多范式语言,并且随着新范式的发展,它包含了对众多编程风格的支持。后来的方言,如SchemeClojure,以及DylanJulia等分支,试图简化和合理化Lisp围绕一个干净功能的核心,而Common Lisp旨在保存和更新它所取代的众多旧方言的范式特征。

信息处理语言(IPL),1956,有时被认为是第一种基于计算机的函数编程语言。[32]它是一种用于操纵符号列表的汇编式语言。它确实有一个生成器的概念,它相当于一个接受函数作为参数的函数,并且,由于它是一个汇编级语言,代码可以是数据,因此IPL可以被视为具有更高阶函数。但是,它在很大程度上依赖于变异列表结构和类似的命令性功能。

Kenneth E. Iverson在20世纪60年代早期开发了APL,在他1962年出版的“ A Programming Language”ISBN 9780471430148)一书中有所描述。APL是约翰巴克斯FP的主要影响力。在90年代初,艾弗森和罗杰·惠创建Ĵ。在20世纪90年代中期,以前曾与艾弗森合作过的亚瑟惠特尼创建了K,后者在金融行业中与其后代Q一起商业化使用。

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

1973年语言ML被创造罗宾·米尔纳爱丁堡大学大卫·特纳开发的语言SASL圣安德鲁斯大学。同样在20世纪70年代的爱丁堡,Burstall和Darlington开发了功能语言NPL。NPL基于Kleene递推方程,并在他们的程序转换工作中首次引入。然后Burstall,MacQueen和Sannella将ML的多态类型检查结合起来,产生了Hope语言。ML最终发展成几种方言,其中最常见的是OCamlStandard ML

同时,如有影响力的Lambda论文和经典的1985年教科书“计算机程序的结构和解释”中所描述的,Scheme的发展,Lisp 的简单词汇范围和(不纯)功能方言,将功能性编程的力量意识提升到更广泛的范围。编程语言社区。

在20世纪80年代,Per Martin-Löf开发了直觉型理论(也称为建构型理论),它将功能性程序与表达为依赖类型的建设性证据联系起来。这导致了交互式定理证明的新方法,并影响了后续函数式编程语言的发展。 David Turner开发的懒惰功能语言Miranda最初出现于1985年,对Haskell有很强的影响力。由于米兰达是专有的,Haskell于1987年开始达成共识以形成一个功能规划研究的开放标准 ; 实施版本自1990年以来一直在进行中。

最近,它已经在基于CSG几何框架构建的OpenSCAD语言的参数CAD中得到了应用,尽管它无法重新分配值导致了通常不熟悉函数式编程作为概念的用户之间的混淆。功能编程继续用于商业环境。

  • 函数式编程的三大特性:

    • immutable data 不可变数据:像Clojure一样,默认上变量是不可变的,如果你要改变变量,你需要把变量copy出去修改。这样一来,可以让你的程序少很多Bug。因为,程序中的状态不好维护,在并发的时候更不好维护。(你可以试想一下如果你的程序有个复杂的状态,当以后别人改你代码的时候,是很容易出bug的,在并行中这样的问题就更多了)
    • first class functions:这个技术可以让你的函数就像变量一样来使用。也就是说,你的函数可以像变量一样被创建,修改,并当成变量一样传递,返回或是在函数中嵌套函数。这个有点像Javascript的Prototype(参看Javascript的面向对象编程
    • 尾递归优化:我们知道递归的害处,那就是如果递归很深的话,stack受不了,并会导致性能大幅度下降。所以,我们使用尾递归优化技术——每次递归时都会重用stack,这样一来能够提升性能,当然,这需要语言或编译器的支持。Python就不支持。
  • 函数式编程的几个技术

    • map & reduce :这个技术不用多说了,函数式编程最常见的技术就是对一个集合做Map和Reduce操作。这比起过程式的语言来说,在代码上要更容易阅读。(传统过程式的语言需要使用for/while循环,然后在各种变量中把数据倒过来倒过去的)这个很像C++中的STL中的foreach,find_if,count_if之流的函数的玩法。
    • pipeline:这个技术的意思是,把函数实例成一个一个的action,然后,把一组action放到一个数组或是列表中,然后把数据传给这个action list,数据就像一个pipeline一样顺序地被各个函数所操作,最终得到我们想要的结果。
    • recursing 递归 :递归最大的好处就简化代码,他可以把一个复杂的问题用很简单的代码描述出来。注意:递归的精髓是描述问题,而这正是函数式编程的精髓。
    • currying:把一个函数的多个参数分解成多个函数, 然后把函数多层封装起来,每层函数都返回一个函数去接收下一个参数这样,可以简化函数的多个参数。在C++中,这个很像STL中的bind_1st或是bind2nd。
    • higher order function 高阶函数:所谓高阶函数就是函数当参数,把传入的函数做一个封装,然后返回这个封装函数。现象上就是函数传进传出,就像面向对象对象满天飞一样。
  • 还有函数式的一些好处

    • parallelization 并行:所谓并行的意思就是在并行环境下,各个线程之间不需要同步或互斥。
    • lazy evaluation 惰性求值:这个需要编译器的支持。表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值,也就是说,语句如x:=expression; (把一个表达式的结果赋值给一个变量)明显的调用这个表达式被计算并把结果放置到 x 中,但是先不管实际在 x 中的是什么,直到通过后面的表达式中到 x 的引用而有了对它的值的需求的时候,而后面表达式自身的求值也可以被延迟,最终为了生成让外界看到的某个符号而计算这个快速增长的依赖树。
    • determinism 确定性:所谓确定性的意思就是像数学那样 f(x) = y ,这个函数无论在什么场景下,都会得到同样的结果,这个我们称之为函数的确定性。而不是像程序中的很多函数那样,同一个参数,却会在不同的场景下计算出不同的结果。所谓不同的场景的意思就是我们的函数会根据一些运行中的状态信息的不同而发生变化。
    • 参考网站https://en.wikipedia.org/wiki/Functional_programming

Function program language的更多相关文章

  1. 函数式编程(Function Program Language)

    WHAT: 简单说,"函数式编程"是一种"编程范式",也就是如何编写程序的方法论. 它属于"结构化编程"的一种,主要思想是把运算过程尽量写成 ...

  2. History of program (language).

    1 编程语言的发展历程及未来趋势 1.1 编程语言的发展 · 1946 Plankalkul     Konrad Zuse,一位德国工程师,他躲藏在巴伐利亚附近的阿尔卑斯山上时,独立开发了Plank ...

  3. 函数式编程语言(Fuction Program Language)

    一.什么是函数式编程语言 函数式编程语言(functional progarm language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型. ...

  4. functional program language(what,include,why popular)

    函数式语言(functional language)一类程序设计语言.是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型.这种语言具有较强的组织数据结构的能力,可以把某 ...

  5. functional program language

    1.什么是函数式编程语言 函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型.这种语言具有较强的组 ...

  6. C program Language 'EOF' and 'getchar()'

    #include <stdio.h> void main() { int c; c=getchar(); while(c!=EOF) { putchar(c); c=getchar(); ...

  7. 函数式编程语言(Functional Program Language)

    (一) 什么是函数编程语言 简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论. 是一种编程典范, ...

  8. Collection Of SVM Libraries By Language via datasciencecentral

    http://www.datasciencecentral.com/profiles/blogs/collection-of-svm-libraries-by-language Support vec ...

  9. One example to understand SemFix: Program Repair via Semantic Analysis

    One example to understand SemFix: Program Repair via Semantic Analysis Basic Information Authors: Ho ...

随机推荐

  1. Android向通讯录添加联系人的一般方法

    Android向通讯录添加联系人的一般方法 以一个简单的例子加以说明,记得需要相应的权限: 测试代码,关键的内容就在add函数里面. package zhangphil.demo; import an ...

  2. AVR 嵌入式单片机芯片的中断系统介绍

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  3. 基本promise

    function myPromise(fn) { var value = null, callbacks = []; this.then = function (onFulfilled) { call ...

  4. EFCore Lazy Loading + Inheritance = 干净的数据表 (一) 【献给处女座的DB First程序猿】

    前言 α角 与 β角 关于α角 与 β角的介绍,请见上文 如何用EFCore Lazy Loading实现Entity Split. 本篇会继续有关于β角的彩蛋在等着大家去发掘./斜眼笑 其他 本篇的 ...

  5. ffmpeg奇数分辨率转码失败

    偶然遇到将目的分辨率设置成奇数(例如:854x481)导致ffmpeg转码失败(错误:width not divisible by 2 (854x481)) 于是去查了一下原因:由于转码后的pix_f ...

  6. 一些常见的“功能性”JS事件

    ————————倒序上升———————— (2)给一些 保存.提交 按钮,添加 防止重复提交 事件(常见一例) $("#submitRank").attr("disabl ...

  7. 七月在线爬虫班学习笔记(二)——Python基本语法及面向对象

    第二课主要内容如下: 代码格式 基本语法 关键字 循环判断 函数 容器 面向对象 文件读写 多线程 错误处理 代码格式 syntax基本语法 a = 1234 print(a) a = 'abcd' ...

  8. shell_base

    1.使用if_then语句if command then commands fi 先运行if后面的命令,如果命令的退出状态是0(成功执行命令),就将执行then后面,fi前面的所有命令.否则就跳到fi ...

  9. ubuntu16.04运行ros的时候编译工作空间catkin_make出现的一个问题Could not find a package configuration file provided by

    最近在进行ros里面的gazebo仿真之前需要对自己创建的工作空间进行编译,但是进行编译的时候输入catkin_make出现如下错误提示 查阅ROS问答社区之后发现两个比较有用的链接,如下 https ...

  10. sessionFactory中的openSession和getCurrentSession的一些注意事项

    今天进行Hibernate测试时遇到了一个问题 我在用sessionFactory生产seesion时出现了故障,使用getCurrentsesstion时产生异常: Exception in thr ...