相信大家平时或多或少听过不少关于“函数式编程” (FP)相关的词语,有些Geek经常吹捧函数式的优点或者特性比如:纯函数无副作用、不变的数据、高阶函数、流计算模式、尾递归、柯里化等等,再加上目前的函数式理论越来越多的应用于工程中,OCaml,clojure, scala等FP语言日渐火爆。本编文章,笔者准备带领大家深入理解函数式编程的相关理论概念。
定义
首先引用维基百科对函数式编程的解释:在计算机科学里,函数式编程是一种编程范式,它将计算描述为表达式求值并避免了状态和数据改变。函数式编程里面的“函数”指的是数学函数,数学函数和我们平时工作中遇到的编程函数有什么区别呢?
编程函数和数学函数

从上图不难发现:数学函数的特点是对于每一个自变量,存在唯一的因变量与之对应。而编程函数的特点是参数和返回值都不是必须的,函数可能依赖外界或者影响外界。那么编程函数能否转换成数学函数,或者说我们的编程函数能否变成“纯函数”?
如何转换?
对于任何一个编程函数,需要满足下面3个条件,即可转换成纯数学函数。
每个函数必须包含输入参数(作为自变量)
每个函数必须有返回值(作为因变量)
无论何时,给定参数调用函数时,返回值必须一致。

