【函数式编程】基于JS进行函数式编程(四)函子 | MayBe函子 | Monad函子

简介: 【函数式编程】基于JS进行函数式编程(四)函子 | MayBe函子 | Monad函子

相关文章

【函数式编程】基于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函子。


待补充…



相关文章
|
前端开发 JavaScript 数据处理
深入学习JavaScript ES8函数式编程:特性与实践指南
深入学习JavaScript ES8函数式编程:特性与实践指南
83 0
|
4月前
|
存储 JavaScript 前端开发
JavaScript——函数式编程Functor(函子)
JavaScript——函数式编程Functor(函子)
27 0
|
6月前
|
前端开发 JavaScript 开发者
函数式编程在JavaScript中的应用
【6月更文挑战第10天】本文探讨了函数式编程在JavaScript中的应用,介绍了函数式编程的基本概念,如纯函数和不可变数据。文中通过示例展示了高阶函数、不可变数据的使用,以及如何编写纯函数。此外,还讨论了函数组合和柯里化技术,它们能提升代码的灵活性和可重用性。掌握这些函数式编程技术能帮助开发者编写更简洁、可预测的JavaScript代码。
|
7月前
|
JavaScript 前端开发
JavaScript 的数组方法 map()、filter() 和 reduce() 提供了函数式编程处理元素的方式
【5月更文挑战第11天】JavaScript 的数组方法 map()、filter() 和 reduce() 提供了函数式编程处理元素的方式。map() 用于创建新数组,其中元素是原数组元素经过指定函数转换后的结果;filter() 则筛选出通过特定条件的元素生成新数组;reduce() 将数组元素累计为单一值。这三个方法使代码更简洁易读,例如:map() 可用于数组元素乘以 2,filter() 用于选取偶数,reduce() 计算数组元素之和。
52 2
|
7月前
|
JavaScript 前端开发 测试技术
JavaScript中的函数式编程:纯函数与高阶函数的概念解析
【4月更文挑战第22天】了解JavaScript中的函数式编程,关键在于纯函数和高阶函数。纯函数有确定输出和无副作用,利于预测、测试和维护。例如,`add(a, b)`函数即为纯函数。高阶函数接受或返回函数,用于抽象、复用和组合,如`map`、`filter`。函数式编程能提升代码可读性、可维护性和测试性,帮助构建高效应用。
|
7月前
|
JavaScript 前端开发 索引
JavaScript函数式编程【进阶】
JavaScript函数式编程【进阶】
61 1
|
7月前
|
存储 JavaScript 前端开发
JavaScript函数式编程[入门]
JavaScript函数式编程[入门]
58 1
|
7月前
|
前端开发 JavaScript 数据处理
深入学习JavaScript ES8函数式编程:特性与实践指南
深入学习JavaScript ES8函数式编程:特性与实践指南
119 0
|
缓存 JavaScript 前端开发
带你读《现代Javascript高级教程》十四、JavaScript函数式编程(1)
带你读《现代Javascript高级教程》十四、JavaScript函数式编程(1)
|
JavaScript 前端开发 测试技术
带你读《现代Javascript高级教程》十四、JavaScript函数式编程(2)
带你读《现代Javascript高级教程》十四、JavaScript函数式编程(2)