摘要:是可以被的容器類型。出自范疇論數(shù)學(xué)的一個(gè)分支滿足一些定律。滿足的定律是一種特殊的可以鋪平的結(jié)果。說(shuō)明如果用普通第一層異常時(shí)會(huì)連續(xù)執(zhí)行通過(guò)的方式可以在異常發(fā)生時(shí)無(wú)論怎么最后還是它自己從而可以在異常發(fā)生時(shí)避免不必要的錯(cuò)誤執(zhí)行。
functor
functor是可以被map over的容器類型。
關(guān)于這句話比較難理解的是,什么是map over?
(a -> b) -> f a -> f b 意思就是說(shuō)一個(gè)a到b的映射,在接受a的functor之后,返回一個(gè)b的functor,下面是map over應(yīng)用示例,可以結(jié)合著理解這句話。
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"}
說(shuō)明 實(shí)現(xiàn)了map的container是Functor的實(shí)例(JSDT),map是將函數(shù)應(yīng)用到container內(nèi)部的方法。
functor出自范疇論(Category Theory),數(shù)學(xué)的一個(gè)分支,滿足一些定律。
fa.map(x => x) === fa;
fa.map(x => f(g(x))) === fa.map(g).map(f);
說(shuō)明 關(guān)于這兩個(gè)定律下面有一個(gè)很好的理解例子
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()); //trueApplicative Functor
Applicative本質(zhì)是Functor的一種,可以將一個(gè)含有函數(shù)的容器應(yīng)用到另一個(gè)容器中的值上。
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 }
說(shuō)明 Applicative的特性就是多了一層ap,示例中JSDT實(shí)例f中,this._val是抽象函數(shù)單元,可以應(yīng)用到另一個(gè)匿名實(shí)例上。
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);
MonadMonad是一種特殊的Functor,可以Flat(鋪平)map的結(jié)果。
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 }
說(shuō)明 如果用普通map,第一層異常時(shí),會(huì)連續(xù)執(zhí)行,通過(guò)monad的方式可以在異常發(fā)生時(shí),無(wú)論怎么map最后還是它自己,從而可以在異常發(fā)生時(shí)避免不必要的錯(cuò)誤執(zhí)行。
總結(jié)monadic編程重要且普遍,典型的一種應(yīng)用就是promise、還可以配合其它reactive編程框架使用,理解原理能幫助我們更好的使用。在深入過(guò)程中發(fā)現(xiàn)各種稀奇古怪的名詞,但耐心去分析和思考,也不難理解。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/87056.html
摘要:匿名函數(shù)是我們喜歡的一個(gè)重要原因,也是,它們分別消除了很多代碼細(xì)節(jié)上需要命名變量名或函數(shù)名的需要。這個(gè)匿名函數(shù)內(nèi),有更多的操作,根據(jù)的結(jié)果針對(duì)目錄和文件做了不同處理,而且有遞歸。 能和微博上的 @響馬 (fibjs作者)掰扯這個(gè)問(wèn)題是我的榮幸。 事情緣起于知乎上的一個(gè)熱貼,諸神都發(fā)表了意見(jiàn): https://www.zhihu.com/questio... 這一篇不是要說(shuō)明白什么是as...
摘要:組合組合的功能非常強(qiáng)大,也是函數(shù)式編程的一個(gè)核心概念,所謂的對(duì)過(guò)程進(jìn)行封裝很大程度上就是依賴于組合。在理解之前,先認(rèn)識(shí)一個(gè)東西概念容器容器為函數(shù)式編程里普通的變量對(duì)象函數(shù)提供了一層極其強(qiáng)大的外衣,賦予了它們一些很驚艷的特性。 前言 JavaScript是一門(mén)多范式語(yǔ)言,即可使用OOP(面向?qū)ο螅?,也可以使用FP(函數(shù)式),由于筆者最近在學(xué)習(xí)React相關(guān)的技術(shù)棧,想進(jìn)一步深入了解其思想...
摘要:的科學(xué)定義是或者,它的標(biāo)志性原語(yǔ)是。能解決一類對(duì)語(yǔ)言的實(shí)現(xiàn)來(lái)說(shuō)特別無(wú)力的狀態(tài)機(jī)模型流程即狀態(tài)。容易實(shí)現(xiàn)是需要和的一個(gè)重要原因。 前面寫(xiě)了一篇,寫(xiě)的很粗,這篇講講一些細(xì)節(jié)。實(shí)際上Fiber/Coroutine vs Async/Await之爭(zhēng)不是一個(gè)簡(jiǎn)單的continuation如何實(shí)現(xiàn)的問(wèn)題,而是兩個(gè)完全不同的problem和solution domain。 Event Model 我...
摘要:為了盡可能提升互通性,已經(jīng)成為函數(shù)式編程庫(kù)遵循的實(shí)際標(biāo)準(zhǔn)。與輕量級(jí)函數(shù)式編程的概念相反,它以火力全開(kāi)的姿態(tài)進(jìn)軍的函數(shù)式編程世界。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是 CSS 里最閃耀的一瞥;總結(jié),...
摘要:我的目的是確保所有引用的使用都是絕對(duì)安全的,編譯器會(huì)自動(dòng)進(jìn)行檢查。它導(dǎo)致了數(shù)不清的錯(cuò)誤漏洞和系統(tǒng)崩潰,可能在之后年中造成了十億美元的損失。這個(gè)函數(shù)將使用一個(gè)表示我們希望進(jìn)行轉(zhuǎn)換的函數(shù)參數(shù),并返回一個(gè)包含轉(zhuǎn)換結(jié)果的新參數(shù)。 翻譯原文出處:Building a Maybe in JavaScript 鄙人翻譯略差且略有出入,別見(jiàn)笑。 很多時(shí)候我們會(huì)碰到:Uncaught TypeError...
閱讀 1531·2021-09-22 15:52
閱讀 1622·2019-08-30 15:44
閱讀 956·2019-08-30 14:24
閱讀 2762·2019-08-30 13:06
閱讀 2770·2019-08-26 13:45
閱讀 2838·2019-08-26 13:43
閱讀 1084·2019-08-26 12:01
閱讀 1577·2019-08-26 11:56