函数式编程
2015-04-20 09:41
183 查看
函数式编程是种编程典范,它将电脑运算视为函数的计算。函数编程语言最重要的基础是 λ 演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。和过程化编程相比,函数式编程里,函数的计算可随时调用。
中文名
函数式编程
类 型
编程典范
原 理
将电脑运算视为函数的计算
基 础
是λ 演算
1历史
2例子
3特性
▪ 闭包和高阶函数
▪ 惰性计算
▪ 递归
▪ 引用透明性
▪ 副作用
4速度和空间上的顾虑
虽然 λ 演算并非设计来于计算机上执行,但可视为第一个函数式编程语言。1980年代末期,Haskell发布,企图集合很多函数式编程研究里的想法。
速度和空间上的顾虑
函数式编程常被认为严重耗费在CPU和内存资源。主因有二:
早期的函数式编程语言实现时并无考虑过效率问题。
非函数式编程语言为求提升速度,会在某些部分放弃边界检查或垃圾回收等功能。
缓式评估亦为语言如Haskell增加了额外的管理工作。
函数式编程语言
纯函数式的程序没有变量和副作用。
函数式编程经常使用递归。
纯函数式编程语言
因为纯函数式程式设计语言没有变量,函数没有副作用,编写出的程式可以利用memorization、common
subexpression elimination和平行计算在运行时和编译时得到大量优化。
函数式编程中最古老的例子莫过于1958年被创造出来的LISP了,透过 LISP,可以用精简的人力。较现代的例子包括Haskell、Clean、Erlang和Miranda等。
在经常被引用的论文 “Why Functional Programming Matters”(请参阅 参考资料) 中,作者 John Hughes 说明了模块化是成功编程的关键,而函数编程可以极大地改进模块化。在函数编程中,编程人员有一个天然框架用来开发更小的、更简单的和更一般化的模块,
然后将它们组合在一起。函数编程的一些基本特点包括:
支持闭包和高阶函数,支持惰性计算(lazy evaluation)。使用递归作为控制流程的机制。加强了引用透明性。没有副作用。我将重点放在在
Java 语言中使用闭包和高阶函数上,但是首先对上面列出的所有特点做一个概述。
函数编程支持函数作为第一类对象,有时称为 闭包或者 仿函数(functor)对象。实质上,闭包是起函数的作用并可以像对象一样操作的对象。与此类似,FP 语言支持 高阶函数。高阶函数可以用另一个函数(间接地,用一个表达式)
作为其输入参数,在某些情况下,它甚至返回一个函数作为其输出参数。这两种结构结合在一起使得可以用优雅的方式进行模块化编程,这是使用 FP 的最大好处。
除了高阶函数和仿函数(或闭包)的概念,FP 还引入了惰性计算的概念。在惰性计算中,表达式不是在绑定到变量时立即计算,而是在求值程序需要产生表达式的值时进行计算。延迟的计算使您可以编写可能潜在地生成无穷输出的函数。因为不会计算多于程序的其余部分所需要的值,所以不需要担心由无穷计算所导致的
out-of-memory 错误。一个惰性计算的例子是生成无穷 Fibonacci 列表的函数,但是对 第 n 个Fibonacci 数的计算相当于只是从可能的无穷列表中提取一项。
FP 还有一个特点是用递归做为控制流程的机制。例如,Lisp 处理的列表定义为在头元素后面有子列表,这种表示法使得它自己自然地对更小的子列表不断递归。
函数程序通常还加强引用透明性,即如果提供同样的输入,那么函数总是返回同样的结果。就是说,表达式的值不依赖于可以改变值的全局状态。这使您可以从形式上推断程序行为,因为表达式的意义只取决于其子表达式而不是计算顺序或者其他表达式的副作用。这有助于验证正确性、简化算法,甚至有助于找出优化它的方法。
副作用是修改系统状态的语言结构。因为 FP 语言不包含任何赋值语句,变量值一旦被指派就永远不会改变。而且,调用函数只会计算出结果
── 不会出现其他效果。因此,FP 语言没有副作用[1] 。
函数式编程常被认为严重耗费在CPU和存储器资源。主因有二:
早期的函数式编程语言实现时并无考虑过效率问题。
有些非函数式编程语言为求提升速度,不提供自动边界检查或自动垃圾回收等功能。
惰性求值亦为语言如Haskell增加了额外的管理工作。
中文名
函数式编程
类 型
编程典范
原 理
将电脑运算视为函数的计算
基 础
是λ 演算
目录
1历史2例子
3特性
▪ 闭包和高阶函数
▪ 惰性计算
▪ 递归
▪ 引用透明性
▪ 副作用
4速度和空间上的顾虑
1历史编辑
虽然 λ 演算并非设计来于计算机上执行,但可视为第一个函数式编程语言。1980年代末期,Haskell发布,企图集合很多函数式编程研究里的想法。速度和空间上的顾虑
函数式编程常被认为严重耗费在CPU和内存资源。主因有二:
早期的函数式编程语言实现时并无考虑过效率问题。
非函数式编程语言为求提升速度,会在某些部分放弃边界检查或垃圾回收等功能。
缓式评估亦为语言如Haskell增加了额外的管理工作。
函数式编程语言
纯函数式的程序没有变量和副作用。
函数式编程经常使用递归。
纯函数式编程语言
因为纯函数式程式设计语言没有变量,函数没有副作用,编写出的程式可以利用memorization、common
subexpression elimination和平行计算在运行时和编译时得到大量优化。
2例子编辑
函数式编程中最古老的例子莫过于1958年被创造出来的LISP了,透过 LISP,可以用精简的人力。较现代的例子包括Haskell、Clean、Erlang和Miranda等。
3特性编辑
在经常被引用的论文 “Why Functional Programming Matters”(请参阅 参考资料) 中,作者 John Hughes 说明了模块化是成功编程的关键,而函数编程可以极大地改进模块化。在函数编程中,编程人员有一个天然框架用来开发更小的、更简单的和更一般化的模块,然后将它们组合在一起。函数编程的一些基本特点包括:
支持闭包和高阶函数,支持惰性计算(lazy evaluation)。使用递归作为控制流程的机制。加强了引用透明性。没有副作用。我将重点放在在
Java 语言中使用闭包和高阶函数上,但是首先对上面列出的所有特点做一个概述。
闭包和高阶函数
函数编程支持函数作为第一类对象,有时称为 闭包或者 仿函数(functor)对象。实质上,闭包是起函数的作用并可以像对象一样操作的对象。与此类似,FP 语言支持 高阶函数。高阶函数可以用另一个函数(间接地,用一个表达式)作为其输入参数,在某些情况下,它甚至返回一个函数作为其输出参数。这两种结构结合在一起使得可以用优雅的方式进行模块化编程,这是使用 FP 的最大好处。
惰性计算
除了高阶函数和仿函数(或闭包)的概念,FP 还引入了惰性计算的概念。在惰性计算中,表达式不是在绑定到变量时立即计算,而是在求值程序需要产生表达式的值时进行计算。延迟的计算使您可以编写可能潜在地生成无穷输出的函数。因为不会计算多于程序的其余部分所需要的值,所以不需要担心由无穷计算所导致的out-of-memory 错误。一个惰性计算的例子是生成无穷 Fibonacci 列表的函数,但是对 第 n 个Fibonacci 数的计算相当于只是从可能的无穷列表中提取一项。
递归
FP 还有一个特点是用递归做为控制流程的机制。例如,Lisp 处理的列表定义为在头元素后面有子列表,这种表示法使得它自己自然地对更小的子列表不断递归。
引用透明性
函数程序通常还加强引用透明性,即如果提供同样的输入,那么函数总是返回同样的结果。就是说,表达式的值不依赖于可以改变值的全局状态。这使您可以从形式上推断程序行为,因为表达式的意义只取决于其子表达式而不是计算顺序或者其他表达式的副作用。这有助于验证正确性、简化算法,甚至有助于找出优化它的方法。
副作用
副作用是修改系统状态的语言结构。因为 FP 语言不包含任何赋值语句,变量值一旦被指派就永远不会改变。而且,调用函数只会计算出结果── 不会出现其他效果。因此,FP 语言没有副作用[1] 。
4速度和空间上的顾虑编辑
函数式编程常被认为严重耗费在CPU和存储器资源。主因有二:早期的函数式编程语言实现时并无考虑过效率问题。
有些非函数式编程语言为求提升速度,不提供自动边界检查或自动垃圾回收等功能。
惰性求值亦为语言如Haskell增加了额外的管理工作。
相关文章推荐
- Spark的函数式编程
- Python学习笔记,函数式编程,高阶函数
- 【更新,更易懂】函数式编程:Functor、Applicative 和 Monad
- Python学习系列:函数式编程
- java实现scala的map方法,实现函数式编程
- Python04_函数式编程
- JavaScript 函数式编程
- 【python学习】之二、函数式编程
- python的嵌套函数,递归,匿名函数,函数式编程,高阶函数,内置函数
- 论坛源码推荐(10.27):Swift/Objective-C行为驱动开发测试框架,函数式编程的Swift库
- PYTHON修饰器的函数式编程
- F#入门之使用 .NET Framework 中的函数式编程技术
- 简要介绍JAVA8中的函数式编程;Brief Introduction to Functional Programming in Java 8
- 可爱的 Python : Python中函数式编程,第一部分
- Scalaz(54)- scalaz-stream: 函数式多线程编程模式-Free Streaming Programming Model
- 又一个函数式编程语言来了?
- 函数式编程和命令式编程
- 用Python的函数式编程特性解释Y Combinator(仿JavaScript版)
- python-函数式编程,反射,random,md5,pickle,json,re,time
- python 函数式编程工具