Functional Programming Introduction浅读
summary_2018/12
designIdea
1、背景
- 函数式编程是一种编程范式,常见的编程范式有命令式编程(Imperative programming),函数式编程,逻辑式编程,常见的面向对象编程是也是一种命令式编程。
- 函数编程语言来源于λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值),可以用来清晰地定义什么是一个可计算函数。
2、简介
- Functional programming languages are specially designed to handle symbolic computation and list processing applications. Functional programming is based on mathematical functions. Some of the popular functional programming languages include: Lisp, Python, Erlang, Haskell, Clojure, etc.
- 一句有意思的话:函数式编程关心类型(代数结构)之间的关系(即数据的映射),命令式编程关心解决问题的步骤。
// 一个累积器的例子:
// 平时实现
function fact (n) {
let res = 0
for (let i = 0; i <= n; i++)
res *= i
return res
}
// fp
function fact1 (n) {
if (n === 1) return 1
return n * fact1(n - 1)
}
// 我们可以看到,在fp中,我们没有使用循环,没有使用中间变量来存储中间值,实现过程更接近人的思维,即数学思想,而不是机器执行过程。
3、FP的特性
3.1、函数是"第一等公民"
- 即函数也和变量一样,处于同样的地位,可以复制给其它变量
即:
// fp
const a = function fact1 (n) {
if (n === 1) return 1
return n * fact1(n - 1)
}
3.2、只用表达式、不用语句
- 表达式:表达式指单纯的运算过程,总是有返回值。
- 语句:执行某种操作没有返回值
- 因为,函数式编程最初的开发动机是为了处理运算,不考虑系统的读写,但在实际上是不可能的,只能尽可能的避免不必要的读写行为
3.3、没有副作用
- 即函数需要保持独立,即不会对外部产生任何影响(比如修改外部变量),仅返回一个新值。
3.4、不修改状态、变量
- 我们经常会用变量来保存状态,但函数式编程不修改变量,因此我们的状态不能保存在变量中,而是保存在参数中,最好的例子就是递归。
// fp
const a = function fact1 (n) {
if (n === 1) return 1
// 在参数中保存状态
return n * fact1(n - 1)
}
3.5、引用透明
- 指含糊的运行不依赖于外部的变量,只依赖于输入的参数,相同的参数总返回相同的结果,即像数学中的映射。
3.6、高级特性(重要)
- 柯里化
- 闭包
- 惰性加载
- 高阶函数:map/reduce等等
4、FP的优点
4.1、代码简洁,开发快速
4.2、接近自然语言,易于理解
// 更偏向于人的思维而不是机器
// (1 + 2) * 3 - 4
实现:add(1,2).multiply(3).subtract(4)
4.3、更方便的代码管理
- 函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。
4.5、易于"并发编程"
- 函数式编程不修改变量,因此不用担心一个线程修改另一个线程的问题,可以放心的并发。
4.6、代码的热升级
- 函数式编程不会修改外部变量,只要函数相同,总返回相同的值,且没有外部依赖,因此可以进行热重启。
5、参考