函数式编程,维基百科:https://en.wikipedia.org/wiki/Functional_programming
函数式编程初探,阮一峰:http://www.ruanyifeng.com/blog/2012/04/functional_programming.html
函数式编程(Functional programming),把计算作为一种数学意义上的函数,避免改变状态以及使用可变的对象或数据,是一种编程范式(Programming paradigms)。
编程范式是指计算机程序结构和元素的构建方法。我们熟知的过程式(Procedural programming)编程和面向对象式(Object-Oriented Programming, OOP)编程,也都属于特定的编程范式。
过程式编程和面向对象式编程在大类上属于命令式编程(Imperative programing)。与命令式编程相对的是声明式编程(Declarative programming),函数式编程就属于声明式编程。
函数式编程的几个要点
- 函数是第一等公民 (1st class citizen)
所谓第一等公民,是指函数这个类型同其他基本的类型,如整型、浮点型、字符串、布尔型等,地位类似,都可以作为函数的输入或输出,都是第一等的公民。
函数的参数可以接受函数类型,参数包含有函数类型的函数为高阶函数。 - 函数是数学意义上的函数,要 “纯”,没有副作用(Side effect )
- 引用透明(Referential transparency):函数只依赖输入的参数,不依赖于外部变量或"状态"。任何时候任何情况下,相同输入,相同输出。
- 只使用声明式的形式:只使用声明和表达式(expression),不用语句(statement)。前者表示一种计算过程,不涉及内存读写或I/O操作,计算完即返回,而不管返回值如何用;后者语句表示一种操作的完整过程(如赋值语句、I/O操作),无返回值等状态。
正式因为函数式的这种“纯”的特性,使其程序间的依赖性大大降低,可以很好地适用于线程间并发、进程并行和分布式并行计算。
其他常见的若干点
- 函数柯里化(Currying)
将一个接受多个参数的函数,转化为一条函数链,链中的每个函数只接受一个参数。
如,scala 语言示例:
// common add function receive two arguments
def add(x: Int, y: Int): Int = { return x + y }
add(1, 2) //3
// currying
def add(x: Int) = { (y: Int) => x + y }
val addOne = add(1)
addOne(2) // 3
val adder = add(_)(_) // or add _
adder(1)(2) // 3
- 延迟求值(Lazy evaluation)
相对于立即求值,延迟求值是指等到使用的时候才计算对应表达式的值。