函数式编程的历史

@author chenyun

草稿

定义

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

历史

函数式编程中最古老的例子莫过于1958年被创造出来的LISP了。但是要提及函数式编程的例子却不得不从更早的λ演算说起。


是否存在一个通用模型来解决一切计算任务?1936年,阿隆佐·邱奇设计了一个名为lambda演算的形式系统。这个系统实质上是为一个超级机器设计的编程语言。在这种语言里面,函数的参数是函数,返回值也是函数。这种函数用希腊字母lambda(λ),这种系统因此得名。
除了阿隆佐,艾伦·图灵也在进行类似的研究。他设计了一种完全不同的系统(后来被称为图灵机),并用这种系统得出了和阿隆佐相似的答案。到了后来人们证明了图灵机和lambda演算的能力是一样的。有关lambda演算的支持请查阅维基百科

1949年第一台电子离散变量自动计算机诞生并取得了巨大的成功。它是冯·诺伊曼设计架构的第一个实例,也是一台现实世界中实现的图灵机。到了50年代末,一个叫John McCarthy的MIT教授(他也是普林斯顿的硕士)对阿隆佐的成果产生了兴趣。1958年他发明了一种列表处理语言(Lisp),这种语言是一种阿隆佐lambda演算在现实世界的实现,而且它能在冯·诺伊曼计算机上运行!很多计算机科学家都认识到了Lisp强大的能力。1973年在MIT人工智能实验室的一些程序员研发出一种机器,并把它叫做Lisp机。于是阿隆佐的lambda演算也有自己的硬件实现了!

特点概述

在函数式语言中,函数(lambda 演算)作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合。

函数式编程中的函数这个术语不是指计算机中的函数(实际上是Subroutine 子程序),而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的。

与函数式编程对应的是命令式编程,命令式编程是面向计算机硬件的抽象,有变量(对应着存储单元),赋值语句(获取,存储指令),表达式(内存引用和算术运算)和控制语句(跳转指令).

命令式程序就是一个冯诺依曼机的指令序列.

常见语言和函数式编程

对比

  命令式范式(OOP) 函数式范式
一切都是对象 第一等公民是函数
抽象和封装 带有闭包的Lambdas/Anonymous函数
有副作用 无副作用的调用
核心活动是组合和对象,这是通过加入新的方法实现的 核心活动是编写新的函数。
着重于数据和状态 不变性,大部分无态处理,没有状态和变量
基于图灵机 基于lambda演算

 面向对象和面向函数一直在争论,实际上纯粹的OOP和纯粹的FP都是极端的。

  • 对于OOP来讲:存在的并一定都是对象,函数就不是对象
  • 对于FP来说:存在的并不总是纯粹的,副作用总是真实存在
函数式中将超过计算的东西叫做副作用,因为文件读写,打印,随机数,这些东西都不是纯的计算过程,而是涉及到外部世界的交互,依赖于机器,不在理论的范畴。这些是不可避免的,因此副作用总是真实存在的。

但总的来说函数式编程是不可避免的潮流

最后

  1. 任何编程语言中都没有什么魔法或者万灵丹药,使其使用者成为好的程序员。
  2. 不要让世界适应你的模型。让你的模型适应世界。

原文地址:http://xight.top/2016/04/06/%E5%87%BD%E6%95%B0%E5%BC%8F%E5%8F%98%E6%88%90%E8%8C%83%E4%BE%8B-1-%E5%8E%86%E5%8F%B2%E4%B8%8E%E6%A6%82%E8%BF%B0/

原文地址:https://www.cnblogs.com/qiu777/p/10439110.html

时间: 2024-11-09 02:53:26

函数式编程的历史的相关文章

Javascript 中的函数式编程

本文和大家分享的主要是javascript中函数式编程相关内容,一起来看看吧,希望对大家学习javascript有所帮助. 函数式编程(functional programming)或称函数程序设计,又称泛函编程,是一种编程范型,比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程. 函数式编程,近年来一直被炒得火热,国内外的开发者好像都在议论和提倡这种编程范式.在众多的函数式语言中,Jav

JavaScript 与函数式编程

原文:https://bethallchurch.github.io/JavaScript-and-Functional-Programming/ 译文:http://www.zcfy.cc/article/1013 译者注:推荐一篇译文,<函数式编程术语解析>. 本文是我在 2016 年 7 月 29 号听 Kyle Simpson 精彩的课程<Functional-Light JavaScript>时所做的笔记(外加个人的深入研究)(幻灯片在这). 长久以来,面向对象在 Jav

深入浅出 Python 函数式编程

1.函数式编程的定义与由来 如果程序中的函数仅接受输入并产生输出,即输出只依赖于输入,数据不可变,避免保存程序状态,那么就称为函数式编程(Functional Programming,简称FP,又称泛函编程). 这种风格也称声明式编程(Declarative Programming),与之相对的是指令式编程(Imperative Programming),后者中的对象会不断修改自身状态.函数式编程强调程序的执行结果比执行过程更重要,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算

用函数式编程技术编写优美的 JavaScript

用函数式编程技术编写优美的 JavaScript_ibm作者: 字体:[增加 减小] 类型:转载函数式编程语言在学术领域已经存在相当长一段时间了,但是从历史上看,它们没有丰富的工具和库可供使用.随着 .NET 平台上的 Haskell 的出现,函数式编程变得更加流行.一些传统的编程语言,例如 C++ 和 JavaScript,引入了由函数式编程提供的一些构造和特性.在许多情况下,JavaScript 的重复代码导致了一些拙劣的编码.如果使用函数式编程,就可以避免这些问题.此外,可以利用函数式编程

Golang-函数式编程(闭包)

github:https://github.com/ZhangzheBJUT/blog/blob/master/closure.md 一 函数式编程概论 在过去近十年时间里,面向对象编程大行其道,以至于在大学的教育里,老师也只会教给我们两种编程模型,面向过程和面向对象.孰不知,在面向对象思想产生之前,函数式编程已经有了数十年的历史.就让我们回顾这个古老又现代的编程模型,看看究竟是什么魔力将这个概念在21世纪的今天再次拉入我们的视野. 随着硬件性能的提升以及编译技术和虚拟机技术的改进,一些曾被性能

Scala函数式编程设计原理 第一课 编程范式(Programming Paradigms)

我使用Scala有一两年的时间了,这门语言仿佛有一种魔力,让人用过就不想放手.Scala给我的整个程序生涯带来了非常深刻的影响,让我学会了函数式编程,让我知道了世界上居然还有这么一种优雅.高效.强大的语言. Scala在国外已经非常流行,但是不知为何,在国内总是不温不火,在此,我特别想为Scala这门语言在国内的发展做一些事情.不才不敢谈Scala的编程经验,因为要成为Scala大神还有很长的路要走,只好翻译一份Scala视频教程以飨读者,大家发现有误的地方,请多多批评指教. 这个视频的作者是S

函数式编程扫盲篇

1. 概论 在过去的近十年的时间里,面向对象编程大行其道.以至于在大学的教育里,老师也只会教给我们两种编程模型,面向过程和面向对象. 孰不知,在面向对象产生之前,在面向对象思想产生之前,函数式编程已经有了数十年的历史. 那么,接下来,就让我们回顾这个古老又现代的编程模型,让我们看看究竟是什么魔力将这个概念,将这个古老的概念,在21世纪的今天再次拉入了我们的视野. 2. 什么是函数式编程 在维基百科中,已经对函数式编程有了很详细的介绍. 那我们就来摘取一下Wiki上对Functional Prog

从Racket入门函数式编程

一直想学学LISP,今天总算开了个头.现在学习LISP不是为了马上能够用于实际项目的应用,而是为了学习一下函数式的思维方式,能够更加深入的了解计算的本质,能够更好的用C++, Java, Python等编写程序.更何况,这些主流语言都逐渐增加了函数式编程的特征,C++,Java现在都引入了 Lambda 表达式.如果能够系统学习一下LISP,相信对自己以后掌握这些语言的新特新特征,对自己写JavaScript.Python,对自己了解闭包.高阶函数.Lambda表达式都会有很大帮助.言归正传,首

从 Racket 入门函数式编程

一直想学学LISP,今天总算开了个头.如今学习LISP不是为了立就可以以用于实际项目的应用,而是为了学习一下函数式的思维方式,可以更加深入的了解计算的本质,可以更好的用C++, Java, Python等编敲代码.更何况,这些主流语言都逐渐添加了函数式编程的特征,C++,Java如今都引入了 Lambda 表达式.假设可以系统学习一下LISP,相信对自己以后掌握这些语言的新特新特征,对自己写JavaScript.Python,对自己了解闭包.高阶函数.Lambda表达式都会有非常大帮助.言归正传