国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

lixiang / 2207人閱讀

摘要:代碼組合在函數(shù)式編程中,通過(guò)將一個(gè)個(gè)功能單一的純函數(shù)組合起來(lái)實(shí)現(xiàn)一個(gè)復(fù)雜的功能,就像樂(lè)高拼積木一樣,這種稱為函數(shù)組合代碼組合。函數(shù)式編程就變成了運(yùn)用不同的函子,解決實(shí)際問(wèn)題。

高階函數(shù)

滿足以下兩點(diǎn)的函數(shù):

函數(shù)可以作為參數(shù)被傳遞

函數(shù)可以作為返回值輸出

叫高階函數(shù),很顯然js中的函數(shù)滿足高階函數(shù)的條件。

函數(shù)作為參數(shù):

function pow(x) {
    return x * x;
}
const arr = [1, 2, 3];
const res = arr.map(pow);

函數(shù)作為返回值:

function getPrintFn() {
    function print(msg) {
        console.log(msg);
    }
    return print;
}

高階函數(shù)與函數(shù)式編程有什么關(guān)系?通過(guò)上一篇我們知道函數(shù)式編程采用純函數(shù),那怎么把不純的函數(shù)轉(zhuǎn)化為一個(gè)純函數(shù)呢?通過(guò)把不純的操作包裝到一個(gè)函數(shù)中,再返回這個(gè)函數(shù)(即上面的例子),即可達(dá)到目的。

柯里化(curry)
只傳遞給函數(shù)一部分參數(shù)來(lái)調(diào)用它,讓它返回一個(gè)函數(shù)去處理剩下的參數(shù)。

特點(diǎn):
接收單一參數(shù),將更多的參數(shù)通過(guò)回調(diào)函數(shù)來(lái)搞定;
返回一個(gè)新函數(shù),用于處理所有的想要傳入的參數(shù);
需要利用call/apply與arguments對(duì)象收集參數(shù);
返回的這個(gè)函數(shù)正是用來(lái)處理收集起來(lái)的參數(shù);

function add(x, y) {
    return x + y;
}

// 柯里化
function add(x) {
    return function(y) {
        return x + y;
    }
}
const increment = add(1);
increment(2); // 3

當(dāng)我們談?wù)摷兒瘮?shù)的時(shí)候,我們說(shuō)它們接受一個(gè)輸入返回一個(gè)輸出。curry 函數(shù)所做的正是這樣:每傳遞一個(gè)參數(shù)調(diào)用函數(shù),就返回一個(gè)新函數(shù)處理剩余的參數(shù)。這就是一個(gè)輸入對(duì)應(yīng)一個(gè)輸出。curry函數(shù)適用于以下場(chǎng)景:

延遲執(zhí)行:不斷的柯里化,累積傳入的參數(shù),最后執(zhí)行。

固定易變因素:提前把易變因素,傳參固定下來(lái),生成一個(gè)更明確的應(yīng)用函數(shù)。最典型的代表應(yīng)用,是bind函數(shù)用以固定this這個(gè)易變對(duì)象。

代碼組合(compose)

在函數(shù)式編程中,通過(guò)將一個(gè)個(gè)功能單一的純函數(shù)組合起來(lái)實(shí)現(xiàn)一個(gè)復(fù)雜的功能,就像樂(lè)高拼積木一樣,這種稱為函數(shù)組合(代碼組合)。下面看一個(gè)例子:

最佳實(shí)踐是讓組合可重用。

函子

我們知道,函數(shù)式編程實(shí)質(zhì)是通過(guò)管道把數(shù)據(jù)在一系列純函數(shù)間傳遞,但是,控制流(control flow)、異常處理(error handling)、異步操作(asynchronous actions)和狀態(tài)(state)呢?還有更棘手的副作用(effects)呢?這些問(wèn)題的解決就要引入函子的概念了。

我們首先定義一個(gè)容器,用來(lái)封裝數(shù)據(jù)

函子封裝了數(shù)據(jù)和對(duì)數(shù)據(jù)的操作,functor 是實(shí)現(xiàn)了map函數(shù)并遵守一些特定規(guī)則的容器類型。

把值裝進(jìn)一個(gè)容器,而且只能使用 map 來(lái)處理它,這么做的理由到底是什么呢?
讓容器自己去運(yùn)用函數(shù)能給我們帶來(lái)什么好處?
Functor 是一個(gè)對(duì)于函數(shù)調(diào)用的抽象,我們賦予容器自己去調(diào)用函數(shù)的能力。當(dāng) map 一個(gè)函數(shù)時(shí),我們讓容器自己來(lái)運(yùn)行這個(gè)函數(shù),這樣容器就可以自由地選擇何時(shí)何地如何操作這個(gè)函數(shù),以致于擁有惰性求值、錯(cuò)誤處理、異步調(diào)用等等非常牛掰的特性。

函子的類型

1.Maybe(處理null問(wèn)題)
2.Either(if…else)
3.IO(IO、網(wǎng)絡(luò)請(qǐng)求、DOM)
4.Monad(嵌套問(wèn)題)

Maybe

一種用來(lái)處理null和undefined問(wèn)題的函子,避免繁瑣的手動(dòng)判空操作

Either

一種用來(lái)處理if…else問(wèn)題的函子

IO

通過(guò)返回一個(gè)獲取數(shù)據(jù)的函數(shù)來(lái)延遲IO的副作用,等調(diào)用者去執(zhí)行有副作用的函數(shù),
以保證獲取數(shù)據(jù)過(guò)程中的無(wú)副作用特性

Monad

monad 是可以變扁(flatten)的實(shí)現(xiàn)了of方法的 functor

總結(jié)

學(xué)習(xí)函數(shù)式編程,實(shí)際上就是學(xué)習(xí)函子的各種運(yùn)算。由于可以把運(yùn)算方法封裝在函子里面,所以又衍生出各種不同類型的函子,有多少種運(yùn)算,就有多少種函子。函數(shù)式編程就變成了運(yùn)用不同的函子,解決實(shí)際問(wèn)題。

參考文檔
https://github.com/xitu/gold-...
https://llh911001.gitbooks.io...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/104535.html

相關(guān)文章

  • 【響應(yīng)編程的思維藝術(shù)】 (1)Rxjs專題學(xué)習(xí)計(jì)劃

    摘要:由于技術(shù)棧的學(xué)習(xí),筆者需要在原來(lái)函數(shù)式編程知識(shí)的基礎(chǔ)上,學(xué)習(xí)的使用。筆者在社區(qū)發(fā)現(xiàn)了一個(gè)非常高質(zhì)量的響應(yīng)式編程系列教程共篇,從基礎(chǔ)概念到實(shí)際應(yīng)用講解的非常詳細(xì),有大量直觀的大理石圖來(lái)輔助理解流的處理,對(duì)培養(yǎng)響應(yīng)式編程的思維方式有很大幫助。 showImg(https://segmentfault.com/img/bVus8n); [TOC] 一. 響應(yīng)式編程 響應(yīng)式編程,也稱為流式編程...

    lscho 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.16 - 淺入淺出 JavaScript 函數(shù)編程

    摘要:函數(shù)式編程,一看這個(gè)詞,簡(jiǎn)直就是學(xué)院派的典范。所以這期周刊,我們就重點(diǎn)引入的函數(shù)式編程,淺入淺出,一窺函數(shù)式編程的思想,可能讓你對(duì)編程語(yǔ)言的理解更加融會(huì)貫通一些。但從根本上來(lái)說(shuō),函數(shù)式編程就是關(guān)于如使用通用的可復(fù)用函數(shù)進(jìn)行組合編程。 showImg(https://segmentfault.com/img/bVGQuc); 函數(shù)式編程(Functional Programming),一...

    csRyan 評(píng)論0 收藏0
  • 函數(shù)編程

    摘要:高階函數(shù)在函數(shù)式語(yǔ)言中,函數(shù)是這個(gè)語(yǔ)言中的一等公民。高階函數(shù)可以接收函數(shù)作為參數(shù),或者返回一個(gè)函數(shù)結(jié)果,或者兩者同時(shí)具備。下面我們看另一個(gè)高階函數(shù)我們通過(guò)向函數(shù)傳遞一個(gè)常量來(lái)創(chuàng)建一個(gè)函數(shù),將給任意值加上。只要有引用指向它該函數(shù)就會(huì)一直存在。 上篇文章介紹了純函數(shù),相信你已經(jīng)理解了純函數(shù)的概念。下面我們接著看一段代碼 let minimum = 21; let checkAge = a...

    高璐 評(píng)論0 收藏0
  • JavaScript函數(shù)編程

    摘要:函數(shù)式編程二拖延癥了好久,第二篇終于寫(xiě)出來(lái)了。如果你對(duì)熟悉的話應(yīng)該還記得,是可以調(diào)用來(lái)集中處理錯(cuò)誤的對(duì)于函數(shù)式編程我們也可以做同樣的操作,如果運(yùn)行正確,那么就返回正確的結(jié)果如果錯(cuò)誤,就返回一個(gè)用于描述錯(cuò)誤的結(jié)果。 JavaScript函數(shù)式編程(二) 拖延癥了好久,第二篇終于寫(xiě)出來(lái)了。 上一篇在這里:JavaScript函數(shù)式編程(一) 上一篇文章里我們提到了純函數(shù)的概念,所謂的純函數(shù)...

    booster 評(píng)論0 收藏0
  • JavaScript 函數(shù)編程

    摘要:注意是單一參數(shù)柯里化是由以邏輯學(xué)家命名的,當(dāng)然編程語(yǔ)言也是源自他的名字,雖然柯里化是由和發(fā)明的。辨別類型和它們的含義是一項(xiàng)重要的技能,這項(xiàng)技能可以讓你在函數(shù)式編程的路上走得更遠(yuǎn)。 slide 地址 三、可以,這很函數(shù)式~ showImg(https://segmentfault.com/img/remote/1460000015978685?w=187&h=160); 3.1.函數(shù)是一...

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

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

0條評(píng)論

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