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}// fpfunction fact1 (n) { if (n === 1) return 1 return n * fact1(n - 1)}// 我们可以看到,在fp中,我们没有使用循环,没有使用中间变量来存储中间值,实现过程更接近人的思维,即数学思想,而不是机器执行过程。
3、FP的特性
3.1、函数是"第一等公民"
- 即函数也和变量一样,处于同样的地位,可以复制给其它变量
即:// fpconst a = function fact1 (n) { if (n === 1) return 1 return n * fact1(n - 1)}
3.2、只用表达式、不用语句
- 表达式:表达式指单纯的运算过程,总是有返回值。
- 语句:执行某种操作没有返回值
- 因为,函数式编程最初的开发动机是为了处理运算,不考虑系统的读写,但在实际上是不可能的,只能尽可能的避免不必要的读写行为
3.3、没有副作用
- 即函数需要保持独立,即不会对外部产生任何影响(比如修改外部变量),仅返回一个新值。
3.4、不修改状态、变量
- 我们经常会用变量来保存状态,但函数式编程不修改变量,因此我们的状态不能保存在变量中,而是保存在参数中,最好的例子就是递归。
// fpconst 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、参考