资讯专栏INFORMATION COLUMN

fp->monadic

DC_er / 1180人阅读

摘要:是可以被的容器类型。出自范畴论数学的一个分支满足一些定律。满足的定律是一种特殊的可以铺平的结果。说明如果用普通第一层异常时会连续执行通过的方式可以在异常发生时无论怎么最后还是它自己从而可以在异常发生时避免不必要的错误执行。

functor

functor是可以被map over的容器类型。

关于这句话比较难理解的是,什么是map over?

(a -> b) -> f a -> f b 意思就是说一个a到b的映射,在接受a的functor之后,返回一个b的functor,下面是map over应用示例,可以结合着理解这句话。

const f= x => x.split("").reverse().join("");
const rs="olleh";
const b=f(rs);  
console.log(b); //hello


function JSDT(val) {
    this._val=val;
}
JSDT.prototype.map=function (f) {
    return new JSDT(f(this._val));
};
JSDT.of=function (val) {
    return new JSDT(val);
}
const fa=JSDT.of(rs);
const fb=fa.map(f);  
console.log(fb);   //JSDT {_val: "hello"}

说明 实现了map的container是Functor的实例(JSDT),map是将函数应用到container内部的方法。

functor出自范畴论(Category Theory),数学的一个分支,满足一些定律。

fa.map(x => x) === fa;

fa.map(x => f(g(x))) === fa.map(g).map(f);

说明 关于这两个定律下面有一个很好的理解例子

var a=[1,2,3].map(x => x);
console.log(a);  //[ 1, 2, 3 ]

const f= x => x+2;
const g= x => x*2;
var b1=[1,2,3].map(x => f(g(x)));
var b2=[1,2,3].map(g).map(f);
console.log(b1.toString()===b2.toString()); //true
Applicative Functor

Applicative本质是Functor的一种,可以将一个含有函数的容器应用到另一个容器中的值上。

JSDT.prototype.ap=function (container) {
    return container.map(this._val);
}
const f=JSDT.of(x => x+2);
let fy=f.ap(JSDT.of(3));
console.log(fy);  //JSDT { _val: 5 }

说明 Applicative的特性就是多了一层ap,示例中JSDT实例f中,this._val是抽象函数单元,可以应用到另一个匿名实例上。

applicative满足的定律

a.of(x => x).ap(val) === val;

a.of(f).op(a.of(x)) === a.of(f(x));

u.ap(a.of(y)) === a.of(f => f(y)).ap(u);

Monad

Monad是一种特殊的Functor,可以Flat(铺平)map的结果。

function Nothing() {
}
Nothing.prototype.map=function () {
    return this;
}
const nothing=new Nothing();
JSDT.prototype.flat=function () {
    return this._val;
}
JSDT.prototype.flatMap=function (f) {
    return this.map(f).flat();
}
let fm=JSDT.of({val:0}).
    flatMap(x => {
    if(x) return JSDT.of(x.val);
    else return nothing;
})
    .map(x => x+1)
    .map( x => 2/x);
console.log(fm);  //JSDT { _val: 2 }

说明 如果用普通map,第一层异常时,会连续执行,通过monad的方式可以在异常发生时,无论怎么map最后还是它自己,从而可以在异常发生时避免不必要的错误执行。

总结

monadic编程重要且普遍,典型的一种应用就是promise、还可以配合其它reactive编程框架使用,理解原理能帮助我们更好的使用。在深入过程中发现各种稀奇古怪的名词,但耐心去分析和思考,也不难理解。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87056.html

相关文章

  • 和少妇白洁一起学JavaScript之Async/Await

    摘要:匿名函数是我们喜欢的一个重要原因,也是,它们分别消除了很多代码细节上需要命名变量名或函数名的需要。这个匿名函数内,有更多的操作,根据的结果针对目录和文件做了不同处理,而且有递归。 能和微博上的 @响马 (fibjs作者)掰扯这个问题是我的荣幸。 事情缘起于知乎上的一个热贴,诸神都发表了意见: https://www.zhihu.com/questio... 这一篇不是要说明白什么是as...

    Bryan 评论0 收藏0
  • Js-函数式编程

    摘要:组合组合的功能非常强大,也是函数式编程的一个核心概念,所谓的对过程进行封装很大程度上就是依赖于组合。在理解之前,先认识一个东西概念容器容器为函数式编程里普通的变量对象函数提供了一层极其强大的外衣,赋予了它们一些很惊艳的特性。 前言 JavaScript是一门多范式语言,即可使用OOP(面向对象),也可以使用FP(函数式),由于笔者最近在学习React相关的技术栈,想进一步深入了解其思想...

    whinc 评论0 收藏0
  • 和少妇白洁一起学JavaScript之Async/Await II

    摘要:的科学定义是或者,它的标志性原语是。能解决一类对语言的实现来说特别无力的状态机模型流程即状态。容易实现是需要和的一个重要原因。 前面写了一篇,写的很粗,这篇讲讲一些细节。实际上Fiber/Coroutine vs Async/Await之争不是一个简单的continuation如何实现的问题,而是两个完全不同的problem和solution domain。 Event Model 我...

    番茄西红柿 评论0 收藏0
  • 翻译连载 | 附录 C:函数式编程函数库-《JavaScript轻量级函数式编程》 |《你不知道的J

    摘要:为了尽可能提升互通性,已经成为函数式编程库遵循的实际标准。与轻量级函数式编程的概念相反,它以火力全开的姿态进军的函数式编程世界。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实的梁柱;分享,是 CSS 里最闪耀的一瞥;总结,...

    Miracle 评论0 收藏0
  • 尝试在JavaScript中构建一个"Maybe"检测器

    摘要:我的目的是确保所有引用的使用都是绝对安全的,编译器会自动进行检查。它导致了数不清的错误漏洞和系统崩溃,可能在之后年中造成了十亿美元的损失。这个函数将使用一个表示我们希望进行转换的函数参数,并返回一个包含转换结果的新参数。 翻译原文出处:Building a Maybe in JavaScript 鄙人翻译略差且略有出入,别见笑。 很多时候我们会碰到:Uncaught TypeError...

    bingo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<