0%

函数式编程

函数式编程

起源

历程:
命令式(脚本) => 面向对象式
命令式(脚本) => 函数式

解决代码复用的问题

原理特点

什么是函数式原理

  • 加法结合律 | 因式分解 | 完全平方工时

  • 水源 => 组合(水管 + 走线) => 花洒

理论思想

  1. 一等公民——函数 => 1.逻辑功能最终实现的落脚点 2.实现函数+拼接流程
  2. 声明式编程
  3. 惰性执行-衔接性,性能节约

实际开发

1.纯函数改造

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const _class = {
name: 'objective',
}
// 函数内部引入了外部变量
const score = (str) => _class.name + ':' + str
// 直接修改了输入参数
const changeClass = (obj, name) => (obj.name = name)

/***** ↓ 修改后 ↓ *****/
const _class = {
name: 'objective',
}

const score = (obj, str) => obj.name + ':' + str
const changeClass = (obj, name) => ({ ...obj, name })

changeClass(_class, 'functional')
score(_class, 'good')

2.流水线组装-加工&组装

  1. 加工 - 科里化
1
2
3
4
5
6
7
8
// f(x,y,z) => f(x)(y)(z)
const add = x => y => z=> return x+y+z;
add(1)(2)(3) // 6
// 要实现 体系=加工+组装,单个加工输入输出应该单值化 => 单元函数
const fetch = ajax(method,url,params);
const fetch = ajax.get(method);
const request = fetch(url);
组合(fetch,request);

面试题

手写构造可拆分传参的累加函数
add(1)(2)(3)(4)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 构造科里化结构
// 输入 处理外层arguments => 类数组处理
// 传入参数无线拓展 => 返回函数本身
// 主功能 => 累加
// 输出 支持从函数到产出的转换
const add = function (...nums) {
// input
let args = Array.prototype.slice.call(arguments)
// 内层
let inner = function (...nums) {
args.push(...arguments)
return inner
}
inner.toString = function () {
return args.reduce((prev, cur) => {
return prev + cur
})
}
return inner
}
  1. 流水线 - 组装函数
1
2
3
4
5
6
const compose = (f, g) => (x) => f(g(x))

const sum1 = (x) => x + 1
const sum2 = (x) => x + 2
const sum12 = compose(sum1, sum2)
sum12(1)

常见的三方库

lodash

rxjs

-------------本文结束感谢阅读-------------