命令式编程
命令式编程就是冯诺伊曼的指令序列
关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。
声明式编程
声明式编程 是以数据结构的形式来表达程序执行的逻辑。
告诉计算机应该做什么,但不指定具体要怎么做。
HTML、CSS、SQL
函数式编程
函数式编程是面向数学的抽象,将计算描述为一种表达式求值
函数式编程是一种编程范式,它将 电脑运算 视为 函数运算,并且 避免使用 程序状态 以及 易变对象。 ——维基百科
不同不体现在符号上,而体现在关系上。
函数式编程起源——λ演算
λ演算(读作lambda演算)由数学家阿隆佐·邱奇在20世纪30年代首次发表,它从数理逻辑(Mathematical logic)中发展而来,使用变量绑定(binding)和代换规则(substitution)来研究函数如何抽象化定义(define)、函数如何被应用(apply)以及递归(recursion)的形式系统。
视频讲解
函数形式
代换规则
左式 – 柯里化等于 --> 右式
对应js中写法
可以通过函数来定义数字
并在此基础上定义 运算法则
但一切都是基于函数的!
图灵机
图灵机 是建立在数据和指令之上的
冯诺依曼架构 是对图灵机的物理实现
编程发展 是在一步步限制图灵机的指令自由度,同时不减少其解决问题的能力
goto 被弃用 转而用结构化编程保障其能力
封装工具函数
面向对象 管理数据与函数
函数式编程 限制了图灵机破序的能力
函数式编程范式特点
- 函数是 第一等公民
- 函数是纯函数(相同的输入总会得到相同的输出,并且不会产生副作用)
通常需要封装以下函数以提高开发效率
- 函数合成(compose)将不同函数拼接成新的函数
- 函数柯里化(Currying)又称部分求值,通过闭包的方式提前存入一些函数参数值,返回新的函数以备后续调用
function sum(a, b) {
return a + b
}
function sumCurry(x) {
return function(y) {
return sum(x, y)
}
}
const sum25 = sumCurry(25)
sum25(2) // 27
- 高阶函数
- 函数作为参数被传递(回调函数),将多个类似的函数中变化的部分抽离,从而达到封装的目的。
- 函数作为返回值输出,意味着运算过程延续到之后执行