本文已参与「新人创作礼」活动,一起开启掘金创作之路
契机
之前简单了解过函数式编程(Function programm),但没有深入,最近面试的时候被问到了,没敢说,事后觉得非常可惜,于是用了一天好好看了看相关概念和应用场景,下面一起来看下
以下内容不是学习笔记,也不会参照笔记详细的写,都是看过后的一些回忆和思路,这样能展现一些我认知的过程,不会说只是提出一些散碎的概念
FP是什么
- fp是范畴论的数学分支,是一种编程范式,属于声明式编程。主要思想是把计算机的运算看作是函数的运算,也是把程序问题抽象为数学问题。
- 一个范畴里包含不同的值,值和值之间的变换叫做“态射”,也就是函数
思路
- 既然是数学问题,一定要保证它的纯度,即没有副作用,不依赖外部状态、变量,否则没法满足数学运算
- 既然要保证纯度,就会丧失它的扩展性,比如
function overSpeed(speed) {
return speed > 60;
}
就没法改变60,只能以这种硬编码的形式 4. 于是引出了偏应用函数,这种方式具有可缓存的特性
const createOverSpeed = (baseSpeed)
=> speed
=> speed > baseSpeed
- 柯里化是偏应用函数的变种,应用较多,比如redux中的中间件
- 随后反柯里化也出来了
- 那回到数学运算上来,组合和组合子也出现了,在FP中是不推荐语句的,取而代之的就是组合子
- 这些组合带来的好处和特性有惰性求值、惰性函数、惰性链
- 然后还有尾递归和高级函数
- 范畴内的值和态射引出以上的概念,范畴之间的变化就可以引出函子(Functor)了
- 我们把范畴叫做容器,函子本身也是一种范畴,函子的标志就是具有map方法,map接收一个f,对容器内每个值进行转换,生成一个新的容器。是的,所以Array也是一种函子
- redux也是函子的典型应用,它的核心概念就是状态机和函数式编程
- 函子有很多种类(pointed,either,maybe,io,ap),大家自己去了解,最重要的一种是monad,它的输入输出不是值,而是数据类型,也就实现了链式调用,他的典型应用就是Promise
总结
函数式编程的理念是很好的,但也不要说总想在业务上就全部要使用这种编程范式,他更多是应用在工具库中,提供稳定强壮的工具,这让开发者可以很放心的使用它。同时函数式编程没有副作用的特性,简直是单元测试的福音。
推荐的库和书籍
- lodash
- rxjs(vue的朋友可以选择vue-rx)
- 《看完就够用的函数式编程》