前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【基于 JS 的函数式编程 - 4】函子 | MayBe函子 | Monad函子

【基于 JS 的函数式编程 - 4】函子 | MayBe函子 | Monad函子

作者头像
前端修罗场
发布2023-10-07 18:38:58
发布2023-10-07 18:38:58
35300
代码可运行
举报
文章被收录于专栏:Web 技术Web 技术
运行总次数:0
代码可运行

我们知道,函数式编程的技术有 柯里化、偏函数等等。错误处理也是一种技术,本节中我们会使用函子(Functor),用一种纯函数的方式帮助我们处理错误。

概念

函子

定义: 函子是一个普通对象,它实现了map函数,在遍历每个对象值的时候生成一个新对象。即,函子是一个实现了 map 契约的对象!

简单理解:函子是一个持有值的容器。 例如下面这个容器,它能够持有任何传给它的值。

代码语言:javascript
代码运行次数:0
运行
复制
const Container = function(val) {this.value=val;}
let testVal = new Container(3);

这样一来,Container持有了内部的值,我们传入的任何js数据类型,Container都会持有它。

在继续之前,我们为 Container 创建一个名为 of 的静态工具类方法, 它可以为我们在创建新的 Container 时省略 new 关键字。

代码语言:javascript
代码运行次数:0
运行
复制
Container.of = function(val){return new Container(val);}

那么我们就可以通过of创建Container:

代码语言:javascript
代码运行次数:0
运行
复制
let testVal = Container.of(3);//省略new

为什么函子实现了map函数

map函数从Container中取出值,将传入的函数应用于其上,并将结果放回Container。如图:

实现代码:

代码语言:javascript
代码运行次数:0
运行
复制
Container.prototype.map = function(fn) {
	return Container.of(fn(this.value));
}
let double = (x)=>x+x;
Container.of(3).map(double); //{value:6} 得到一个新对象

MayBe函子

  • 用函数式方式处理错误或异常。
代码语言:javascript
代码运行次数:0
运行
复制
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函子。Promise 就是一种 Monad。那么,我们就可以知道 Monad 函子的一大特点就是能够避免深层嵌套,只要提供下一运算所需要的的函数,就能将函数拆解成互相连接的多个步骤,自动进行下去,并且每次都是只返回一个单层的函子。这个函子有一个 flatMap 方法,即降维的能力。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
    • 函子
    • 为什么函子实现了map函数
  • MayBe函子
  • Monad函子
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档