Functor
程序员文章站
2022-03-23 15:53:20
...
定义:是一个容器,也是个普通容器,实现了flapMap接口(map函数),在遍历每个值得时候生成新的对象。
这个过程是无副作用地、不可变的访问和修改操作。包裹不安全的值,提升代码健壮性。避免程序异常中断。
1、隔离不纯
2、合并判空逻辑
3、避免异常
4、支持函数组合
5、中心化逻辑,提供默认值
Functor
/**
* 不能使用箭头函数
* 箭头函数没有constructor和prototype
* @constructor
*/
interface Functor<T> {
(arg: T): T,
of: any,
prototype: object,
}
// 创建一个容器
const Functor = function <Functor>(val) {
this.value = val;
}
// 添加of接口,省略new去创建
Functor.of = function (val) {
// @ts-ignore
return new Functor(val);
}
// 实现map接口
Functor.prototype.map = function (fn) {
return Functor.of(fn(this.value));
}
const v = Functor.of(2);
const t = Functor.of({a: 1});
const r = Functor.of([1, 2]);
console.log(v, t, r);
// Functor { value: 2 } Functor { value: { a: 1 } } Functor { value: [ 1, 2 ] }
console.log(v.map((x)=> {
return x * x
}).map((x)=> {
return x + x;
}));
// Functor { value: 8 }
Maybe
集中管理无效数据的检查,可合并判空 但是无法详细的给出错误的位置
/**
* MayBe函子
* @param val
* @constructor
*/
Functor.prototype.isNothing = function () {
return this.value !== undefined && this.value !== null;
};
/**
* 重写map函数
* @param fn
*/
Functor.prototype.map = function (fn) {
return this.isNothing() ? Functor.of(null) : Functor.of(fn(this.value));
};
// 测试代码
const n = Functor.of(null).map((v)=> {
return v * 1;
}).map((v)=> {
return v;
});
console.log(n); // Functor { value: null }
Either
从故障中恢复 可给出具体的错误位置 并可延迟抛出异常,使代码可正常执行