摘要:前面我們已經(jīng)知道如何書寫函數(shù)式的程序了,但是我們還沒提到控制流異常處理異步操作和狀態(tài)呢容器容器為函數(shù)式編程里普通的變量對(duì)象函數(shù)提供了一層極其強(qiáng)大的外衣,賦予了它們一些很驚艷的特性按照我們的慣例,先從最簡(jiǎn)單的容器入手。
如果你前面都看完了跟到了這里,我只能說你很棒棒,不過我不得不說,這才剛剛開始。前面我們已經(jīng)知道如何書寫函數(shù)式的程序了,但是我們還沒提到控制流(control flow)、異常處理(error handling)、異步操作(asynchronous actions)和狀態(tài)(state)呢?
容器容器為函數(shù)式編程里普通的變量、對(duì)象、函數(shù)提供了一層極其強(qiáng)大的外衣,賦予了它們一些很驚艷的特性
按照我們的慣例,先從最簡(jiǎn)單的容器入手。
var Container = function(x) { this.__value = x; } Container.of = function(x) { return new Container(x); };
試著執(zhí)行以下Container.of(3),看看輸出的值。
jQuery $(...) 返回的對(duì)象并不是一個(gè)原生的 DOM 對(duì)象,而是對(duì)于原生對(duì)象的一種封裝,某種意義上就是一個(gè)“容器”。
我們接著添加一個(gè)map方法
Container.prototype.map = function(f){ return Container.of(f(this.__value)) } Container.of(3) .map(x => x + 1) //=> Container(4) .map(x => "Result is " + x); //=> Container("Result is 4")
這個(gè)跟前面我們提到的數(shù)組操作的map方法非常類似,數(shù)組的map方法返回一個(gè)新的數(shù)組,Container的map方法返回一個(gè)新的Container。
上面的這個(gè)具有map方法的容器就是我們接下來要引出來的函子。
Functor(函子)是實(shí)現(xiàn)了 map 并遵守一些特定規(guī)則的容器類型。
Functor 是一個(gè)對(duì)于函數(shù)調(diào)用的抽象,我們賦予容器自己去調(diào)用函數(shù)的能力。當(dāng) map 一個(gè)函數(shù)時(shí),我們讓容器自己來運(yùn)行這個(gè)函數(shù),這樣容器就可以自由地選擇何時(shí)何地如何操作這個(gè)函數(shù),以致于擁有惰性求值、錯(cuò)誤處理、異步調(diào)用等等非常牛掰的特性
接著我們看看牛掰的Functor能為我們做什么
var Maybe = function(x) { this.__value = x; } Maybe.of = function(x) { return new Maybe(x); } Maybe.prototype.isNothing = function() { return (this.__value === null || this.__value === undefined); } Maybe.prototype.map = function(f) { return this.isNothing() ? Maybe.of(null) : Maybe.of(f(this.__value)); } Maybe.of("Malkovich Malkovich").map(match(/a/ig)); //=> Maybe(["a", "a"]) Maybe.of(null).map(match(/a/ig)); //=> Maybe(null),代碼并沒有報(bào)錯(cuò),我們?cè)趯?duì)函數(shù)調(diào)用時(shí),檢查了函數(shù)是否為空
我們?nèi)绻幌胍恢?map .map, 可以用柯里化函數(shù)對(duì)上面的代碼稍微改進(jìn)一下
var map = curry((f, any_functor_at_all) => any_functor_at_all.map(f));
錯(cuò)誤處理
var Left = function(x) { this.__value = x; } var Right = function(x) { this.__value = x; } Left.of = function(x) { return new Left(x); } Right.of = function(x) { return new Right(x); } Left.prototype.map = function(f) { return this; } Right.prototype.map = function(f) { return Right.of(f(this.__value)); }
var getAge = user => user.age ? Right.of(user.age) : Left.of("ERROR!"); getAge({name: "stark", age: "21"}).map(age => "Age is " + age); getAge({name: "stark"}).map(age => "Age is " + age); //Left 會(huì)終端機(jī)鏈?zhǔn)秸{(diào)用
最后來看下我們不得不做的IO操作
let readLocalStorage = () => { return window.localStorage; }
機(jī)智的改造成純函數(shù)
let readLocalStorage = () => { return () => {window.localStorage}; }
然而并沒有什么軟用
var IO = function(f) { this.__value = f; } IO.of = function(x) { return new IO(() => x); } IO.prototype.map = function(f) { return new IO(_.compose(f, this.__value)); }
var io_window = new IO(function(){ return window; }); io_window.map(function(win){ return win.innerWidth }); io_window.map(_.prop("location")).map(_.prop("href")).map(split("/")); var $ = function(selector) { return new IO(function(){ return document.querySelectorAll(selector); }); } $("#myDiv").map(head).map(function(div){ return div.innerHTML; });
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/82881.html
摘要:首先先祝大家國(guó)慶節(jié)快樂今天距離為我運(yùn)營(yíng)公眾號(hào)已經(jīng)一個(gè)月了,今天把文章整合一下,希望對(duì)大家有幫助,也謝謝朋友的支持,我會(huì)繼續(xù)堅(jiān)持原創(chuàng),寫更好的文章給大家一視頻獲取學(xué)習(xí)資源分享合集二功能篇實(shí)現(xiàn)金額的語(yǔ)音播報(bào)功能基于模式風(fēng)格的封裝之路炫酷動(dòng)畫跳 showImg(https://segmentfault.com/img/remote/1460000011437678?w=900&h=500);...
摘要:首先先祝大家國(guó)慶節(jié)快樂今天距離為我運(yùn)營(yíng)公眾號(hào)已經(jīng)一個(gè)月了,今天把文章整合一下,希望對(duì)大家有幫助,也謝謝朋友的支持,我會(huì)繼續(xù)堅(jiān)持原創(chuàng),寫更好的文章給大家一視頻獲取學(xué)習(xí)資源分享合集二功能篇實(shí)現(xiàn)金額的語(yǔ)音播報(bào)功能基于模式風(fēng)格的封裝之路炫酷動(dòng)畫跳 showImg(https://segmentfault.com/img/remote/1460000011437678?w=900&h=500);...
摘要:函數(shù)式編程我在網(wǎng)上看了很多關(guān)于的函數(shù)式編程的教程,不過我感覺很多不是照抄的或者就是故弄玄虛。函數(shù)式編程幾分鐘就完事兒了,簡(jiǎn)單的讓人發(fā)指。函數(shù)式編程理解這么多就夠了,再實(shí)用就可以看源碼了。 JS函數(shù)式編程 我在網(wǎng)上看了很多關(guān)于javascript的函數(shù)式編程的教程,不過我感覺很多不是照抄的或者就是故弄玄虛。js發(fā)展到今天越來越往瑜伽圈的風(fēng)氣發(fā)展了,拿腔拿調(diào)裝13不好好說話,好像你講的東...
閱讀 2203·2021-11-18 10:07
閱讀 3599·2021-09-04 16:48
閱讀 3303·2019-08-30 15:53
閱讀 1314·2019-08-30 12:55
閱讀 2516·2019-08-29 15:08
閱讀 3222·2019-08-29 15:04
閱讀 2953·2019-08-29 14:21
閱讀 2974·2019-08-29 11:21