内容简介:满足以下两点的函数:叫高阶函数,很显然js中的函数满足高阶函数的条件。函数作为参数:
高阶函数
满足以下两点的函数:
- 函数可以作为参数被传递
- 函数可以作为返回值输出
叫高阶函数,很显然js中的函数满足高阶函数的条件。
函数作为参数:
function pow(x) { return x * x; } const arr = [1, 2, 3]; const res = arr.map(pow);
函数作为返回值:
function getPrintFn() { function print(msg) { console.log(msg); } return print; }
高阶函数与函数式编程有什么关系?通过上一篇我们知道函数式编程采用纯函数,那怎么把不纯的函数转化为一个纯函数呢?通过把不纯的操作包装到一个函数中,再返回这个函数(即上面的例子),即可达到目的。
柯里化(curry)
只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
特点:
接收单一参数,将更多的参数通过回调函数来搞定;
返回一个新函数,用于处理所有的想要传入的参数;
需要利用call/apply与arguments对象收集参数;
返回的这个函数正是用来处理收集起来的参数;
function add(x, y) { return x + y; } // 柯里化 function add(x) { return function(y) { return x + y; } } const increment = add(1); increment(2); // 3
当我们谈论纯函数的时候,我们说它们接受一个输入返回一个输出。curry 函数所做的正是这样:每传递一个参数调用函数,就返回一个新函数处理剩余的参数。这就是一个输入对应一个输出。curry函数适用于以下场景:
- 延迟执行:不断的柯里化,累积传入的参数,最后执行。
- 固定易变因素:提前把易变因素,传参固定下来,生成一个更明确的应用函数。最典型的代表应用,是bind函数用以固定this这个易变对象。
代码组合(compose)
在函数式编程中,通过将一个个功能单一的纯函数组合起来实现一个复杂的功能,就像乐高拼积木一样,这种称为函数组合(代码组合)。下面看一个例子:
最佳实践是让组合可重用。
函子
我们知道,函数式编程实质是通过管道把数据在一系列纯函数间传递,但是,控制流(control flow)、异常处理(error handling)、异步操作(asynchronous actions)和状态(state)呢?还有更棘手的副作用(effects)呢?这些问题的解决就要引入函子的概念了。
我们首先定义一个容器,用来封装数据
函子封装了数据和对数据的操作,functor 是实现了map函数并遵守一些特定规则的容器类型。
把值装进一个容器,而且只能使用 map 来处理它,这么做的理由到底是什么呢?
让容器自己去运用函数能给我们带来什么好处?
Functor 是一个对于函数调用的抽象,我们赋予容器自己去调用函数的能力。当 map 一个函数时,我们让容器自己来运行这个函数,这样容器就可以自由地选择何时何地如何操作这个函数,以致于拥有惰性求值、错误处理、异步调用等等非常牛掰的特性。
函子的类型
1.Maybe(处理null问题)
2.Either(if…else)
3.IO(IO、网络请求、DOM)
4.Monad(嵌套问题)
Maybe
一种用来处理null和undefined问题的函子,避免繁琐的手动判空操作
Either
一种用来处理if…else问题的函子
IO
通过返回一个获取数据的函数来延迟IO的副作用,等调用者去执行有副作用的函数,
以保证获取数据过程中的无副作用特性
Monad
monad 是可以变扁(flatten)的实现了of方法的 functor
总结
学习函数式编程,实际上就是学习函子的各种运算。由于可以把运算方法封装在函子里面,所以又衍生出各种不同类型的函子,有多少种运算,就有多少种函子。函数式编程就变成了运用不同的函子,解决实际问题。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 函数式编程之数组的函数式编程
- 函数式编程 – 函数式编程如何影响您的编码风格?
- 纯函数:函数式编程入门
- 深入理解 Java 函数式编程,第 1 部分: 函数式编程思想概论
- 思想交融,Android中的函数式编程(2):什么是函数式编程
- 编程范式 —— 函数式编程入门
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
函数式算法设计珠玑
Richard Bird / 苏统华、孙芳媛、郝文超、徐琴 / 机械工业出版社 / 2017-4-1 / 69.00
本书采用完全崭新的方式介绍算法设计。全书由30个珠玑构成,每个珠玑单独列为一章,用于解决一个特定编程问题。这些问题的出处五花八门,有的来自游戏或拼图,有的是有趣的组合任务,还有的是散落于数据压缩及字串匹配等领域的更为熟悉的算法。每个珠玑以使用函数式编程语言Haskell对问题进行描述作为开始,每个解答均是诉诸于函数式编程法则从问题表述中计算得到。本书适用于那些喜欢学习算法设计思想的函数式编程人员、......一起来看看 《函数式算法设计珠玑》 这本书的介绍吧!