亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

函數(shù)式編程(五)

qqlcbb / 1122人閱讀

摘要:前面我們已經(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ān)文章

  • 【收藏篇】32篇技術(shù)博文匯總(九月總結(jié))

    摘要:首先先祝大家國(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);...

    whlong 評(píng)論0 收藏0
  • 【收藏篇】32篇技術(shù)博文匯總(九月總結(jié))

    摘要:首先先祝大家國(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);...

    Eric 評(píng)論0 收藏0
  • 體驗(yàn)javascript之美第九課-函數(shù)編程和angular過濾器實(shí)現(xiàn)原理

    摘要:函數(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不好好說話,好像你講的東...

    coordinate35 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<