函数式编程简介

什么是函数式编程

1
2
3
函数式编程(英语:functional programming)或称函数程序设计、泛函编程,是一种编程范式,它将电脑运算视为函数运算,并且避免使用程序状态以及易变对象。其中,λ演算(lambda calculus)为该语言最重要的基础。而且,λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。
比起指令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。
在函数式编程中,函数是第一类对象,意思是说一个函数,既可以作为其它函数的参数(输入值),也可以从函数中返回(输入值),被修改或者被分配给一个变量。 ———— 维基百科

函数式编程是如何编写程序的方法论,主要思想是把运算过程尽量写成一些列嵌套函数的调用。
可以归结为面向过程编程,把复杂任务分解成简单的任务

如下面一个计算

1
(1 + 2) * 3 - 4

使用传统的编程方式

1
2
3
var a = 1 + 2;
var b = a * 3;
var c = b - 4;

使用函数式编程方式

1
const result = subtract(multiply(add(1+2), 3), 4)

区别在于把运算过程定义成了纯函数,而纯函数的特点在于在相同输入的时候,输出结果一定相同,与输入之外的其它隐藏信息无关或状态无关
纯函数可以有多个输出值,但是同样输入条件下输出一定得相同。

函数式编程的特点

1.函数是一等公民,和其它数据类型一样,可以作为变量,也可以赋值给其它变量,也可以作为其它函数的参数
2.只使用表达式(只涉及纯运算,总有返回值),不使用语句(执行某种操作,没有返回值)
3.没有副作用,不修改外部变量的值,仅仅返回一个新的值,无其它行为
4.不修改状态,不修改系统变量,状态不能保存在变量中,函数式编程使用参数来保存状态,比如递归。
5.引用透明,输入参数一样,输出结果一定相同。

函数式编程的意义和好处

1.代码简洁,开发快速,大量使用函数,减少重复代码,程序短小,开发较快
2.接近自然语言,易于理解
3.更方便代码管理,不依赖不改变外部状态,结果只依赖输入,方便单元测试、debug、以及模块化
4.易于并发编程,状态间没有依赖,可以开多个线程计算。
5.代码热升级,无副作用,只要保证接口不变内部实现和外部无关,可以在运行状态下更新代码。

函数式编程的缺点

抽象了一层,越抽象的,执行效率越低;与硬件和大多数命令式语言不匹配,他能表达你想要做的,而不是你想要电脑要做的

相关术语

高阶函数 (Higher order function) 如果一个函数接受函数作为参数,或者返回值为函数,那么该函数就是高阶函数。
***闭包 (Closure)***如果一个函数引用了自由变量,那么该函数就是一个闭包。何谓自由变量?自由变量是指不属于该函数作用域的变量(所有全局变量都是自由变量,严格来说引用了全局变量的函数都是闭包,但这种闭包并没有什么用,通常情况下我们说的闭包是指函数内部的函数)。
函数组合 (Composition) 函数式编程的一个特点是通过串联函数来求值。然而,随着串联函数数量的增多,代码的可读性就会不断下降。函数组合就是用来解决这个问题的方法。假设有一个 compose 函数,它可以接受多个函数作为参数,然后返回一个新的函数。当我们为这个新函数传递参数时,该参数就会「流」过其中的函数,最后返回结果。
***柯里化 (Currying)***柯里化是对函数的封装,当调用函数时传递参数数量不足时,会返回一个新的函数,直到参数数量足够时才进行求值。
***模式匹配 (Pattern matching)**模式匹配是指可以为一个函数定义多个版本,通过传入不同参数来调用对应的函数。形式上有点像「方法重载」,但方法重载是通过传入参数类型*不同来区分的,模式匹配没有这个限制。利用模式匹配,我们可以去掉函数中的「分支」(最常见的是 if),写出非常简洁的代码。

相关链接

函数式编程初探
我所了解的函数式编程