定义
函数式编程是一种编程范式,和面向过程,面向对象是同一个范畴的概念。
面向过程编程:编程方式基于过程,主要是向计算机描述我们具体解决问题的每个步骤,描述得越清楚,解决得越好。
面向对象编程:编程方式基于对象,把需要解决的具体问题抽象成对象,对对象的属性和方法进行封装,使对象具有继承,多态等这些特性,通过对象的方法之间互相调用来解决实际问题。
函数式编程:编程方式基于函数,把实际问题抽象出具体的函数,通过函数的组合和传递来解决具体的问题。
特点
- 一类值(first class value)
函数和变量一样,可以作为参数,也可以作为返回值,能够组合参与到具体的某种运算中。 - 不可变性(immutable)
变量的值是不可变的,一但赋予了它某个的值,它的值就不会再改变,这种编程方式使程序员能够更好的进行分析,也就是不会出现某些全局变量的修改,能够修改这些变量的方式有很多种,导致你整个程序的行为是不确定度,增加了这个分析的难点。 - 无副作用(no effect)
副作用是指它不是一个单纯的计算,而是涉及到一个与外部进行交互的一个过程,比如调用一些外部的API,或者做一些IO的操作,它不是一个单纯的计算,它的输出不仅仅取决于你调用这个计算时所给的输入,它还依赖外部的环境条件。比如读取文件时,文件可能不存在,可能没有权限。
优点
- 引用透明
你引用一个函数,这个函数的具体实现更改了之后,你是感觉不到的,它对你是透明的,因为对应函数式编程来说,它的函数都是一些纯函数,也就是他的输入输出是一对一的关系,你给固定的输入,它永远给你固定的输出,具体这个函数内部,它的实现有什么变化,你是感受不到的。 - 容易分析
因为它的行为总是固定的,固定的输入输出永远是固定的,所以比较容易分析。 - 容易测试
因为它的行为是固定的,是不会有任何变化,所以外部会更好的去测试。不像读写数据库之类的,如果是读写数据库的话,它是比较难测试的,因为它依赖于数据库的环境。 - 性能优化
因为给固定的输入,它的输出永远是固定的,所以适合对函数结构做缓存,如果缓存中存在该输入,可以直接返回缓存中计算的结果
缺点
复杂度高,不容易上手:因为大量运用了一些函数,使用函数的组合来解决实际问题,使用组合函数的时候,会使用一些抽象程度更高的函数,去组合一些抽象程度低的函数。导致程序的复杂度非常高,不容易上手。
纯函数
结果仅依赖于参数,不访问外部变量,行为固定,固定的输入,输出永远是相同的
柯里化
1)概念:固定某些参数,得到一个接收剩余参数的函数
2)作用:复用参数,固定的参数之后调用不需要再传,直接调用
2)确定:可读性低,修改成功高