在计算机科学领域,函数式编程是一种编程范式,它是一种构建计算机程序结构的方法和风格,它把程序当做数学函数的求值过程并且避免了改变状态和可变的数据。
二、函数式编程的重要概念:
2.1 纯函数(Pure Function),或函数的纯粹性(Purity),没有副作用(Side Effect)。
副作用是状态的变化(mutation):例子:修改全局变量,抛出异常,IO读写,调用有副作用的函数。
2.2 引用透明(Referential Transparency):对于相同的输入,总是得到相同的输出。
如果f(x)的参数x和函数体都是引用透明的,那么函数f是纯函数。
2.3 不变性(Immutability)为了获得引用透明性,任何值都不能变化。
2.4 函数是一等公民(First-class Function):一切都是计算,函数式编程中只有表达式,变量、函数都是表达式。
三、高阶函数(Higher order Function)
闭包(Closure)
表达式求值策略:严格求值 和 非严格求值 Call By Value vs. Call By Name
惰性求值(Lazy Evaluation):定义表达式不会立即求值,用到后才会求值。
递归函数,函数式编程没有循环,循环由递归实现。调优递归:尾递归。
函数式变成没有循环,用递归实现,解决内存溢出可以用尾递归
函数式编程:一切都是计算,函数式编程中只有表达式,变量、函数都是表达式
引用透明: 对于相同的输入,总是得到相同的输出,
append违反引用透明
不变性:为了获得引用透明性,任何值都不能变化
XplusY_V1就是一个纯函数
函数式变成:避免改变状态和可变的数据
纯函数(函数的纯粹性,没有副作用):
函数式编程
不变性(immutability)
为了获取引用透明性,任何值都不能变化
# 函数式编程
> 命令式编程在理论上上升到语言学的层次,不可判定的问题很多,且为了实用引人更多的模糊地带,是不够严密的。而函数式编程关心语义,从数理逻辑出发建立基础,例如三大语义,泛代数,可靠性完备性,合流,规约等概念,体系上更严密。而且视公理化为头等大事。 - https://www.zhihu.com/question/36782552
- 函数式编程是一种编程范式
## 范式(Paradigm)
- 范式包括 philosophy (理念) 和 methods (方法)两部分
1. 某事的 philosophy (理念) 就是,做某事,什么该做,什么不该做,以及方式
2. Methods (方法)就是继方式之后的具体的操作
## 函数式编程没有副作用
> 副作用指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
```scala
var x=1
def XPlusY_v1(y: Int)=x+y
def XPlusY_v2(y: Int)={x+y;x} //有副作用,改变了x的值
```
## 函数式编程引用透明
- 对于相同的输入,总是得到相同的输出
- 如果f(x)的参数x和函数体都是透明的,那么函数f(x)是纯函数
```scala
var x = new StringBulider("Hello")
var y = x.append(" World!") //Hello World!
var z = x.append(" World!") //Hello World! World!
// appned 方法违反了引用透明性
```
### 不变性 Immutability
- 为了获得引用透明性,任何值都不能变
## 表达式求值
1. 严格求值 call by value
2. 非严格求值 call by name
函数式编程就是一种抽象程序很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输出是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的重要概念
函数式编程中函数是一等公民
什么是 Immutability?
函数式编程和面向对象式编程的区别
什么是 Referential Transparency?
什么是 Side Effect?
函数式编程的概念(说明了什么不是函数式编程)
什么是函数式编程?
什么是函数式编程?
scala里面的两种求值策略
可以把函数当做参数传给另一个函数。也可以把函数当做返回值返回出来,也可以在一个函数体里定义一个函数。
函数式编程的不变性的概念
违反引用透明的例子
引用透明的概念
副作用例子
副作用的解释