函数式编程简介与使用
本文为笔记项,原文可以查看文末的参考链接
我们常见的编程范式有命令式编程(Imperative programming),函数式编程,逻辑式编程等,熟知的面向对象编程是也是一种命令式编程。命令式编程,是一种面向计算机硬件的抽象,有变量和控制语句等,而函数式编程则是面向数学的抽象,将计算描述为一种表达式求值,其主要思想是把运算过程尽量写成一系列嵌套的函数调用。因为其不依赖于外部状态也不修改外部的状态的特性,令其容易定位和调试问题。
本文结构如下:
01
—
特点
函数是"第一等公民"
"第一等公民"(First Class),指的是函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。
只用"表达式",不用"语句"
"表达式"(Expression)是一个单纯的运算过程,总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。
没有"副作用"
"副作用"(Side Effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果 函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
不修改状态
不修改变量,意味着状态不能保存在变量中。函数式编程使用参数保存状态,最好的例子就是递归。
引用透明
引用透明(Referential Transparency),指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。
02
—
常见的使用函数
高阶函数
在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:
接受一个或多个函数作为输入
输出一个函数 接收一个或多个函数作为输入,即函数作为参数传递。
最常见的例子如防抖函数和节流函数:
函数组合
函数组合就是将两个或两个以上的函数组合生成一个新函数的过程:
接受一个或多个函数作为输入
输出一个函数 接收一个或多个函数
例如,我们现在需要面对一个消除空格,格式化成小写字母且字符串切割成数组形式的业务场景,那么我们可以采用如下代码进行实现:
柯里化
柯里化的实现代码如下所示:
偏函数
“偏函数应用(Partial Application)”是指固定一个函数的某些参数,然后产生另一个更小元的函数。而所谓的元是指函数参数的个数,比如含有一个参数的函数被称为“一元函数” 。
“偏函数应用(Partial Application)”与“函数柯里化”之间的区别是:
“偏函数应用”是固定一个函数的一个或多个参数,并返回一个可以接收剩余参数的函数;
“柯里化”是将函数转化为多个嵌套的一元函数,也就是每个函数只接收一个参数。
偏函数的实现代码如下所示:
偏函数
惰性函数就是当第 1 次根据条件执行函数后,在第 2 次调用函数时,就不再检测条件,直接执行函数。例如:
缓存函数
缓存函数是将函数的计算结果缓存起来,当下次以同样的参数调用该函数时,直接返回已缓存的结果,而无需再次执行函数。参考代码如下:
03
—
References
1. 这些高阶的函数技术,你掌握了么【https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651566154&idx=3&sn=7aec668cea30c43091ca730ee631e12e&chksm=8025678bb752ee9dc8277a81f57b5649e180cbabd4da7f94b2ee11446ebbe94c292054b591ff&scene=126&sessionid=1609414612&key=d4524d29905da75eda004c983419ad082dbf8163b8d76477ba56a21948455efa99b0d9bd6968e8a8e99aa809d992151370b54af059ee30bb7e31724fc1e395848e6637e49eea4a0f1665d418b9499b3a8fe6a1bf8ef638938f2ac21cda904d1d8aedc58b73b206a751b1c3bd60add65cabd606cb2ba58a7edd55e7e74aa315f5&ascene=1&uin=MTUyNTM3MDAyNg%3D%3D&devicetype=Windows+7+x64&version=63000039&lang=zh_CN&exportkey=A2JVQ1u%2FtQHbWbIkRzqkE2k%3D&pass_ticket=Vhw5%2Fy0FrVK%2FM7VcOANGlHKCCHOrJewXeuBpqlYATo%2Fw0Dpkq%2FvMWhKALPqGRfgf&wx_header=0】
2. 函数式编程初探【https://www.ruanyifeng.com/blog/2012/04/functional_programming.html】