相关文章
【函数式编程】基于JS 进行函数式编程(一)引入 | 什么是函数式编程 | 函数式编程的优点
【函数式编程】基于JS进行函数式编程(二)高阶函数 | 函数代替数据传递 | 函数是一等公民 | 闭包 | 使用高阶函数实现抽象 | 数组的高阶函数
【函数式编程】基于JS进行函数式编程(三)柯里化 | 偏函数 | 组合与管道
【函数式编程】基于JS进行函数式编程(四)函子 | MayBe函子 | Monad函子
我们知道,函数式编程的技术有 柯里化、偏函数等等。
错误处理
也是一种技术,本节中我们会使用函子(Functor),用一种纯函数的方式帮助我们处理错误。
概念
函子
定义: 函子是一个普通对象
,它实现了map函数
,在遍历每个对象值的时候生成一个新对象
。即,函子是一个实现了map契约的对象!
简单理解:函子是一个持有值的容器。
例如下面这个容器,它能够持有任何传给它的值。
const Container = function(val) {this.value=val;} let testVal = new Container(3); 这样一来,Container持有了内部的值,我们传入的任何js数据类型,Container都会持有它。 在继续之前,我们为Container创建一个名为of的静态工具类方法, 它可以为我们在创建新的Container时省略new关键字。 Container.of = function(val){return new Container(val);} 那么我们就可以通过of创建Container: let testVal = Container.of(3);//省略new
为什么函子实现了map函数
map函数从Container中取出值,将传入的函数应用于其上,并将结果放回Container。如图:
实现代码:
Container.prototype.map = function(fn) { return Container.of(fn(this.value)); } let double = (x)=>x+x; Container.of(3).map(double); //{value:6} 得到一个新对象
MayBe函子
- 用函数式方式处理错误或异常。
const MayBe = function(val) { this.value = val; } MayBe.of = function(val) {return new MayBe(val);} MayBe.prototype.isNothing= function() { //在应用传入的函数之前先使用isNothing函数检查容器中的值是否为null或undefined return (this.value===null ||this.value===undefined); }; MayBe.prototype.map = function() { //map把应用函数的返回值放回了容器 return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(ths.value)); } 调用: MayBe.of("string").map((x)=>x.toUpperCase()); // {value: 'STRING'}
Monad函子
Monad是一个
含有chain方法的函子
你可以通过添加一个chain方法(或者说是join方法)扩展MayBe函子,使其成为一个Monad函子。
待补充…