当前位置: 首页 > Web前端 > vue.js

学习函数式编程Monad

时间:2023-03-31 19:53:36 vue.js

鍦ㄤ笂涓€绡囨枃绔犱腑锛屾垜浠璁轰簡甯歌鐨勫嚱鏁板紡缂栫▼妗堜緥銆備竴浜涘鐢熸姤鍛婅娌℃湁鎻愬埌鍩烘湰姒傚康銆傛兂鐭ラ亾浠€涔堟槸Monad鍚楋紵鍩轰簬杩欎釜闂锛屾垜浠潵鎺㈢┒涓€涓嬨€傚湪鍑芥暟寮忕紪绋嬩腑锛孧onad鏄缁撴瀯鍖栫▼搴忕殑鎶借薄锛屾垜浠€氳繃涓変釜閮ㄥ垎鏉ョ悊瑙e畠銆侻onad瀹氫箟Monad浣跨敤鍦烘櫙Monad涓€鍙ヨ瘽瑙i噴Monad瀹氫箟鏍规嵁缁村熀鐧剧鐨勫畾涔夛紝Monad鐢变互涓嬩笁閮ㄥ垎缁勬垚锛氱被鍨嬫瀯閫犲櫒锛圡锛夛紝鍙互鏋勯€犱竴鍏冪被鍨婱銆備竴涓被鍨嬭浆鎹㈠嚱鏁帮紙returnorunit锛夛紝鍙互鎶婁竴涓師濮嬪€兼墦鍖呭埌M涓€倁nit(x):T->MT鏄竴涓粍鍚堝嚱鏁癰ind锛屽彲浠ユ妸M瀹炰緥涓殑鍊煎彇鍑烘潵锛屾斁鍒颁竴涓嚱鏁颁腑鍘绘墽琛岋紝鏈€缁堝緱鍒颁竴涓柊鐨凪瀹炰緥銆侻鎵цT->M鐢熸垚M鍙﹀锛屽畠杩橀伒瀹堜竴浜涜鍒欙細鍗曞厓鍏冪礌瑙勫垯锛岄€氬父鐢眜nit鍑芥暟瀹炵幇銆傚叧鑱旇鍒欓€氬父鐢辩粦瀹氬嚱鏁板疄鐜般€傛爣璇嗗厓绱狅細闆嗗悎涓笌璇ラ泦鍚堜腑鐨勪簩鍏冭繍绠楃浉鍏崇殑鐗规畩鍏冪礌銆傚綋鍗曞厓鍏冪礌涓庡叾浠栧厓绱犵粍鍚堟椂锛岃繖浜涘厓绱犱笉浼氭敼鍙樸€備箻娉曠殑鍗曚綅鍏冩槸1锛屼换鎰忔暟x1=浠绘剰鏁版湰韬紝1x浠绘剰鏁?浠绘剰鏁版湰韬€傚姞娉曠殑鍗曚綅鍏冩槸0锛屼换鎰忔暟+0=浠绘剰鏁版湰韬紝0+浠绘剰鏁?浠绘剰鏁版湰韬€傝繖浜涘畾涔夊緢鎶借薄锛屾垜浠敤涓€娈礿s浠g爜鏉ユā鎷熶竴涓嬨€傜被Monad{鍊?"";//鏋勯€犲嚱鏁癱onstructor(value){this.value=value;}//unit锛屽皢鍊兼斁鍏onad鐨勬瀯閫犲櫒涓璾nit(value){this.value=value;}//缁戝畾锛屽皢鍊艰浆鎹负鏂扮殑Monadbind(fn){returnfn(this.value);}}//婊¤冻x->M(x)functionadd1(x){returnnewMonad(x+1);}//婊¤冻x->M(x)function鏍煎紡鐨勫嚱鏁皊quare(x){returnnewMonad(x*x);}//鎺ヤ笅鏉ワ紝鎴戜滑鍙互閾惧紡璋冪敤consta=newMonad(2).bind(square).bind(add1);//...console.log(a.value===5);//true涓婇潰鐨勪唬鐮佹槸鏈€鍩烘湰鐨凪onad锛屽畠浼氭妸绋嬪簭涓殑姣忎竴姝ユ彁鍙栨垚涓€涓嚎鎬ф祦锛岄€氳繃bind鏂规硶瀵规暟鎹祦杩涜澶勭悊锛屾渶缁堝緱鍒版垜浠兂瑕佺殑缁撴灉銆傚ソ浜嗭紝鎴戜滑宸茬粡浜嗚В浜哅onad鐨勫唴閮ㄧ粨鏋勩€傛帴涓嬫潵鎴戜滑鐪嬬湅Monad鐨勪娇鐢ㄥ満鏅€侻onad鐨勪娇鐢ㄥ満鏅€氳繃Monad鐨勮鍒欙紝琛嶇敓鍑哄緢澶氱殑浣跨敤鍦烘櫙銆傞泦缁撳绉嶅姛鑳斤紝瀹炵幇杩為攣缁忚惀銆傞摼寮忔搷浣滃彲浠ユ秷闄や腑闂寸姸鎬侊紝瀹炵幇Pointfree椋庢牸銆傞摼寮忔搷浣滀篃鍙互閬垮厤鍑芥暟澶氬眰宓屽鐨勯棶棰榝n1(fn2(fn3()))銆傚鏋滀綘鐢ㄨ繃rxjs锛屽氨鍙互浣撻獙閾惧紡杩愮畻甯︽潵鐨勫揩涔愩€傚鐞嗗壇浣滅敤銆傚寘瑁呭紓姝O绛夊壇浣滅敤鍑芥暟锛屽湪鏈€鍚庝竴姝ユ墽琛屻€傝繕璁板緱Jquery鏃朵唬鐨刟jax鎿嶄綔鍚楋紵$.ajax({type:"get",url:"request1",success:function(response1){$.ajax({type:"get",url:"request2",success:function(response2){$.ajax({type:"get",url:"request3",success:function(response3){console.log(response3);//鑾峰彇鏈€缁堢粨鏋渳,});},});},});涓婇潰鐨勪唬鐮佷腑锛屾垜浠€氳繃鍥炶皟鍑芥暟涓茶鎵ц浜?娆jax鎿嶄綔锛屽悓鏃朵篃浜х敓浜?灞備唬鐮佸祵濂椼€傝繖鏍风殑浠g爜涓嶄粎闅句互闃呰锛屼篃涓嶅埄浜庝互鍚庣殑缁存姢銆侾romise鐨勫嚭鐜拌В鍐充簡涓婅堪闂銆俧etch("request1").then((response1)=>{returnfetch("request2");}).then((response2)=>{returnfetch("request3");}).then((response3)=>{console.log(response3);//鑾峰彇鏈€缁堢粨鏋渳);鎴戜滑浣跨敤Promise灏嗗涓楠ゅ皝瑁呮垚澶氫釜then鏂规硶鎵ц锛屼笉浠呮秷闄や簡澶氬眰浠g爜宓屽鐨勯棶棰橈紝涔熻浠g爜鐨勫垝鍒嗘洿鍔犺嚜鐒讹紝澶уぇ鎻愰珮浜嗕唬鐮佺殑鍙淮鎶ゆ€с€傛兂涓€鎯筹紝涓轰粈涔圥romise鍙互缁х画鎵цthen鏂规硶鍛紵鍏跺疄Promise鍜孧onad寰堢浉浼硷紝瀹冩弧瓒冲涓狹onad瑙勫垯銆侾romise鏈韩灏辨槸涓€涓瀯閫犲嚱鏁般€侻onad涓殑unit鍦≒romise涓彲浠ョ湅鍒颁负锛歺=>Promise.resolve(x)Monad涓殑bind鍦≒romise涓彲浠ョ湅鍒颁负锛歅romise.prototype銆傞偅涔堟垜浠敤浠g爜鏉ラ獙璇佷竴涓嬨€?/棣栧厛瀹氫箟2涓紓姝ュ鐞嗗嚱鏁般€?/寤惰繜1s鐒跺悗娣诲姞涓€涓嚱鏁癲elayAdd1(x){returnnewPromise((resolve)=>{setTimeout(()=>{resolve(x+1);});},1000);}//Delay1sThensquarefunctiondelaySquare(x){returnnewPromise((resolve)=>{setTimeout(()=>{resolve(x*x);});},1000);}/**************************************************************************************************///鍗曚綅e瑙勫垯锛屾弧瓒筹細e*a=a*e=aconstpromiseA=Promise.resolve(2).then(delayAdd1);constpromiseB=delayAdd1(2);//promiseA===promiseB锛屾墍浠romise婊¤冻宸︽亽绛夊紡銆俢onstpromiseC=Promise.resolve(2);constpromiseD=a.then(Promise.resolve);//promiseC===promiseD锛屾墍浠romise婊¤冻姝g‘鐨勫崟鍏冦€?/promise鍚屾椂婊¤冻宸﹀崟鍏冨拰鍙冲崟鍏冿紝鎵€浠romise婊¤冻鍗曞厓銆?/ps:浣嗘湁浜涚壒娈婃儏鍐典笉绗﹀悎瀹氫箟锛屼笅闈細鎻愬埌/************************************************************************************************///鍏宠仈瑙勫垯锛?a*b)*c=a*(b*c)constpromiseE=Promise.resolve(2);甯搁噺promiseF=promiseE.then(delayAdd1)銆倀hen(delaySquare);constpromiseG=promiseE.then(function(x){returndelayAdd1(x).then(g);});//promiseF===promiseG锛屾墍浠romise婊¤冻缁撳悎寰嬨€?/ps:浣嗘槸鏈変簺鐗规畩鎯呭喌涓嶆弧瓒宠繖涓畾涔夈€備笅闈㈡垜浼氳鍒颁笂闈㈢殑浠g爜銆傛垜涓嶇鎰熷埌寰堟儕璁躲€侾romise鍜孧onad澶儚浜嗐€備笉浠呭彲浠ュ疄鐜伴摼寮忔搷浣滐紝杩樺彲浠ユ弧瓒冲崟鍏冨厓绱犮€傝繕鏈夌粨鍚堟€э紝Promise鏄疢onad鍚楋紵瀹為檯涓婏紝Promise骞朵笉瀹屽叏婊¤冻Monad锛氬鏋淧romise.resolve浼犲叆涓€涓狿romise瀵硅薄锛屽畠浼氱瓑寰呬紶鍏ョ殑Promise鎵ц锛屽苟灏嗘墽琛岀粨鏋滀綔涓哄灞侾romise鐨勫€笺€侾romise.resolve鍦ㄥ鐞嗕竴涓猼henable瀵硅薄鏃讹紝涓嶄細鐩存帴杩斿洖瀵硅薄锛岃€屾槸灏嗗璞′腑鐨則hen鏂规硶褰撳仛涓€涓狿romise绛夊緟缁撴灉锛屼綔涓哄灞侾romise鐨勫€笺€傚湪杩欎袱绉嶆儏鍐典笅锛岄兘鏃犳硶婊¤冻Monad瑙勫垯銆?/Promise.resolve浼犲叆涓€涓狿romise瀵硅薄constfunctionA=function(p){//thenp===1returnp.then((n)=>n*2);};constpromiseA=Promise.resolve(1);Promise.resolve(promiseA).then(functionA);//RejectedPromiseTypeError:p.thenisnotafunction//鐢变簬Promise.resolve澶勭悊浼犲叆鐨凱romise锛岀洿鎺ヨ繍琛屼細鎶ラ敊銆傝繚鍙嶈韩浠藉拰鍏宠仈鎬с€?/Promise.resolve浼犲叆涓€涓猼henable瀵硅薄constfunctionB=function(p){//thenp===1alert(p);杩斿洖p.then((n)=>n*2);};constobj={then(r){r(1);},};constpromiseB=Promise.resolve(obj);Promise.resolve(promiseB).then(functionB);//RejectedPromiseTypeError:p.thenisnotafunction//鍥犱负Promise.resolve澶勭悊浜嗕紶鍏ョ殑thenable锛屾墍浠ュ鑷寸洿鎺ヨ繍琛屽嚭閿欍€傝繚鍙嶈韩浠藉拰鍏宠仈鎬с€傜湅鍒拌繖閲岋紝鐩镐俊澶у瀵筆romise鏈変簡鏂扮殑璁よ瘑銆傛鏄儚Monad杩欐牱鐨勯摼寮忔搷浣滐紝浣垮緱Promise鍦ㄥ墠绔紓姝ヤ唬鐮佷腑寰楀埌浜嗗箍娉涚殑搴旂敤銆備綘鍜屾垜涓€鏍锋弧鏄疢onad鍚楋紵鎭╂儏锛烳onad澶勭悊鍓綔鐢ㄦ帴涓嬫潵锛岃鎴戜滑鐪嬬湅鍙︿竴涓父瑙侀棶棰橈細涓轰粈涔坢onad閫傚悎澶勭悊鍓綔鐢紵ps锛氳繖閲屾墍璇寸殑鍓綔鐢ㄦ寚鐨勬槸杩濆弽绾嚱鏁板師鍒欑殑鎿嶄綔銆傛垜浠簲璇ュ敖閲忛伩鍏嶈繖浜涙搷浣滐紝鎴栬€呮渶鍚庢墽琛岃繖浜涙搷浣溿€備緥濡傦細varfs=require("fs");//绾嚱鏁帮紝浼犻€掓枃浠跺悕锛岃繑鍥濵onad瀵硅薄varreadFile=function(filename){//鍓綔鐢ㄥ嚱鏁帮細璇诲彇鏂囦欢constreadFileFn=()=>{returnfs.readFileSync(鏂囦欢鍚?"utf-8");};returnnewMonad(readFileFn);};//绾嚱鏁帮紝浼犲叆x锛岃繑鍥濵onad瀵硅薄varprint=function(x){//鍓綔鐢ㄥ嚱鏁帮細鎵撳嵃鏃ュ織constlogFn=()=>{console.log(x);杩斿洖x;};returnnewMonad(logFn);};//绾嚱鏁帮紝浼犲叆x锛岃繑鍥濵onad瀵硅薄vartail=function(x){//鍓綔鐢ㄥ嚱鏁帮細杩斿洖鏈€鍚庝竴琛岀殑鏁版嵁consttailFn=()=>{杩斿洖x[x.length-1];};returnnewMonad(tailFn);};//閾惧紡鎿嶄綔鏂囦欢constmonad=readFile("./xxx.txt").bind(tail).bind(print);//鎵ц鍒拌繖閲岋紝鏁翠釜鎿嶄綔鏄函绮圭殑锛屽洜涓哄壇浣滅敤鍑芥暟宸茬粡鍖呰9鍦∕onad涓紝涓嶆墽琛宮onad.value()锛?/鎵ц鍓綔鐢ㄥ嚱鏁板湪涓婇潰鐨勪唬鐮佷腑锛屾垜浠皢鍓綔鐢ㄥ嚱鏁板皝瑁呭埌Monad涓紝鏃繚璇佷簡绾嚱鏁扮殑浼樿壇鐗规€э紝鍙堝阀濡欏湴瑙e喅浜嗗壇浣滅敤鐨勫畨鍏ㄩ殣鎮c€傚ソ浜嗭紝鑷虫锛岃繖绡囨枃绔犵殑涓昏鍐呭灏卞垎浜畬浜嗭紝浣嗘槸鏈変竴澶╁湪瀛︿範Monad鐨勬椂鍊欙紝绐佺劧鍙戠幇鏈変汉涓€鍙ヨ瘽鎶奙onad瑙i噴娓呮浜嗐€傞厭鍚э紒璀﹀憡锛氫互涓嬪唴瀹规洿澶氭槸鏁板鐞嗚锛屼笉鎰熷叴瓒g殑鍚屽鍙互璺宠繃銆侻onad鐨勪竴鍙ヨ瘽瑙i噴鏃╁湪10骞村墠锛孭hilipWadler灏卞Monad杩涜浜嗕竴鍙ヨ瘽鎬荤粨銆傚師鏂囷細_鍗曞瓙鏄唴鍑藉瓙鑼冪暣涓殑骞哄崐缇銆傜炕璇戯細Monadisamonoidonthecategoryofself-functors鈥濄€傝繖閲屾爣鍑轰笁涓噸瑕佺殑姒傚康锛歴elf-functors,categories,monoids銆傝繖浜涢兘鏄暟瀛︾煡璇嗐€傛垜浠垎寮€鏉ョ悊瑙c€備粈涔堟槸鑼冪暣锛熶竴鍒囬兘鏄竴涓璞°€傚ぇ閲忕殑瀵硅薄缁勫悎璧锋潵褰㈡垚涓€涓泦鍚堛€傚璞′箣闂村瓨鍦ㄤ竴涓垨澶氫釜杩炴帴銆備换浣曡繛鎺ョО涓烘€佸皠銆備竴鍫嗗璞★紝浠ュ強瀵硅薄涔嬮棿鐨勬墍鏈夋€佸皠銆備竴涓唬鏁扮粨鏋勭О涓鸿寖鐣?浠€涔堟槸鍑藉瓙?鎴戜滑绉拌寖鐣翠箣闂寸殑鏄犲皠涓哄嚱瀛?鏄犲皠鏄竴绉嶇壒娈婄殑鎬佸皠,鎵€浠ュ嚱瀛愪篃鏄竴绉嶆€佸皠.浠€涔堟槸鑷嚱瀛?鑷嚱瀛愭槸鏄犲皠涓€涓被鐨勫嚱瀛愮被鍒湰韬€備粈涔堟槸骞哄崐缇?骞哄崐缇わ紵骞哄崐缇ゆ槸鍏锋湁鎭掔瓑鍏冪殑鍗婄兢銆備粈涔堟槸鍗婄兢锛熷鏋滀竴涓泦鍚堟弧瓒崇粍鍚堝垯瀹冩槸鍗婄兢銆備粈涔堟槸鎭掔瓑鍏冿紵鎭掔瓑鍏冩槸鐗规畩鍏冪礌涓€缁勬槸con鍏虫敞璇ラ泦鍚堜笂鐨勪簩杩涘埗鎿嶄綔銆傚綋涓€涓爣璇嗗厓绱犱笌鍏朵粬鍏冪礌缁勫悎鏃讹紝瀹冧笉浼氭敼鍙橀偅浜涘厓绱犮€備緥濡傦細浠讳綍鏁板瓧+0=鏁板瓧鏈韩銆傞偅涔?灏辨槸鎭掔瓑鍏冿紙additionidentityelement锛変换鎰忔暟*1=鏁版湰韬€傞偅涔?灏辨槸鎭掔瓑鍏冿紙multiplicationidentityelement锛夊ソ浜嗭紝鎴戜滑宸茬粡浜嗚В浜嗘墍鏈夊簲璇ユ帉鎻$殑鎶€鏈湳璇紝涓嬮潰绠€鍗曡В閲婁竴涓嬭繖涓В閲婏細鑷嚱瀛愯寖鐣翠腑鐨勪竴涓购鍗婄兢鍙互鐞嗚В涓猴紝鍦ㄤ竴涓弧瓒崇殑闆嗗悎涓粨鍚堝緥鍜屾亽绛夊緥锛屽瓨鍦ㄤ竴涓槧灏勫叧绯伙紝杩欎釜鏄犲皠鍏崇郴鍙互鎶婇泦鍚堜腑鐨勫厓绱犳槧灏勫埌褰撳墠闆嗗悎鏈韩鐨勫厓绱犱笂銆傜浉淇″湪鎺屾彙浜嗚繖浜涚悊璁虹煡璇嗕箣鍚庯紝涓€瀹氫細瀵筂onad鏈夋洿娣辩殑鐞嗚В銆傛€荤粨鏈枃浠嶮onad鐨勭淮鍩虹櫨绉戝嚭鍙戯紝閫愭浠嬬粛Monad鐨勫唴閮ㄧ粨鏋勫拰瀹炵幇鍘熺悊锛屽苟閫氳繃Promise鏉ラ獙璇丮onad鍦ㄥ疄鎴樹腑鎵€鍙戞尌鐨勯噸瑕佷綔鐢ㄣ€傛枃绔犱腑鍖呭惈浜嗗ぇ閲忕殑鏁板瀹氫箟銆佸嚱鏁板紡缂栫▼鐞嗚绛夌煡璇嗭紝澶ч儴鍒嗘槸鍙傝€冪綉缁滆祫鏂欏拰鑷韩缁忛獙寰楀埌鐨勩€傚鏋滄湁閿欒鐨勫湴鏂癸紝甯屾湜澶у澶氬鎸囨暀馃檹鏈€鍚庯紝澶у瀵规鏈変粈涔堢湅娉曪紝娆㈣繋鐣欒█璇勮锛?/p>