摘要:期函數(shù)式編程中代碼組合如何理解定義顧名思義,在函數(shù)式編程中,就是將幾個有特點的函數(shù)拼湊在一起,讓它們結(jié)合,產(chǎn)生一個嶄新的函數(shù)代碼理解一個將小寫轉(zhuǎn)大寫的函數(shù)一個在字符后加的函數(shù)將兩個函數(shù)組合起來這里假設(shè)我們實現(xiàn)了每日一題每日一題顯示結(jié)果里上面
20190315期
函數(shù)式編程中代碼組合(compose)如何理解?
定義: 顧名思義,在函數(shù)式編程中,Compose就是將幾個有特點的函數(shù)拼湊在一起, 讓它們結(jié)合, 產(chǎn)生一個嶄新的函數(shù)
代碼理解:
// 一個將小寫轉(zhuǎn)大寫的函數(shù) let toUpperCase = (x) => x.toUpperCase(); // 一個在字符后加!的函數(shù) let exclaim = (x) => x + "!"; // 將兩個函數(shù)組合起來, 這里假設(shè)我們實現(xiàn)了compose let shout = compose(toUpperCase,exclaim); shout("js每日一題") // JS每日一題 !, 顯示結(jié)果里上面兩個函數(shù)的特點都應(yīng)用上了pointfree
代碼組合中有一個重要的概念pointfree(永遠不要說出你的數(shù)據(jù)), 它的意思是指函數(shù)無須提及將要操作的數(shù)據(jù)是什么樣的
有點晦澀,我們還是上代碼理解一下
// 我們有一個將字符轉(zhuǎn)換成大寫并且將其空格轉(zhuǎn)換為"-"的函數(shù) // 細節(jié)的同學(xué)應(yīng)該發(fā)現(xiàn)這個函數(shù)暴露了一個word形參 // 根據(jù)pointfree定義,此函數(shù)非pointfree模式 let snakeCase = (word) => word.toUpperCase().replace(/s+/ig,"-"); // 下面這個函數(shù)與上面的功能一致,但我們可以觀察到其沒有數(shù)據(jù)暴露,所以其為pointfree模式 let snakeCase = compose(replace(/s+/ig,"-"),toUpperCase)
說了這么多,他能干什么呢 ? 它能夠幫助我們減少不必要的命名,讓代碼保持簡潔和通用
compose實現(xiàn)上面我們都是假設(shè)已經(jīng)存在compose方法, 接下來我們來為其實現(xiàn)
首先分析其特性
兩個函數(shù)都有一個共同的參數(shù)
函數(shù)的執(zhí)行順序從右至左
前面函數(shù)執(zhí)行的結(jié)果交由后面的函數(shù)處理
根據(jù)上面的示例及我們分析的特性來實現(xiàn)一個最簡版的
// 這樣子其實就能滿足我們上面示例的要求了 const compose = function(f, g) { return function(x) { return f(g(x)); }; };
結(jié)束了嗎? 并沒有,我們可以看到上面的compose示例都只是傳入了兩個函數(shù),因為我們的簡版compose實現(xiàn)也只支持兩個函數(shù),那么如果我們想要支持一條很長很長的管道的時候,顯然上面的compose就不夠用了, 接著我們來看優(yōu)秀的開源庫redux的compose實現(xiàn)
// 摘自 https://github.com/reactjs/redux/blob/master/src/compose.js export default function compose(...funcs) { // 沒有傳入函數(shù)運行直接返回參數(shù) if (funcs.length === 0) { return arg => arg } // 只傳入一個函數(shù),就返回其本身 if (funcs.length === 1) { return funcs[0] } // 核心代碼其實就是一句reduce, reduce特性就是按順序執(zhí)行,并且將結(jié)果傳遞給下一次執(zhí)行, 這里多說一句, reduce順序執(zhí)行多個相依賴的promise也很好用 return funcs.reduce((a, b) => (...args) => a(b(...args))) }總結(jié)
將多個單特性的函數(shù)組合到一起的函數(shù)
多個函數(shù)服務(wù)一組數(shù)據(jù)(共同參數(shù))
不必說出數(shù)據(jù)(pointfree)
函數(shù)從右至左順序執(zhí)行,結(jié)果做為下一個函數(shù)的參數(shù)
關(guān)于JS每日一題JS每日一題可以看成是一個語音答題社區(qū)
每天利用碎片時間采用60秒內(nèi)的語音形式來完成當天的考題
群主在次日0點推送當天的參考答案
注 絕不僅限于完成當天任務(wù),更多是查漏補缺,學(xué)習(xí)群內(nèi)其它同學(xué)優(yōu)秀的答題思路
點擊加入答題
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102720.html
摘要:期函數(shù)式編程中純函數(shù)如何理解概念不依賴執(zhí)行的上下文,也不影響上下文的變量,輸出只由輸入決定代碼理解一下綜上,非純函數(shù)輸入依賴外部變量綜上,非純函數(shù)輸出改變外部變量綜上純函數(shù)輸出輸入不影響外部變量純函數(shù)的好處相信大家發(fā)現(xiàn)了,無論是概念還是代碼 20190313期 函數(shù)式編程中純函數(shù)如何理解? 概念: 不依賴執(zhí)行的上下文,也不影響上下文的變量,輸出只由輸入決定 代碼理解一下 // 綜上,非...
摘要:用法源碼由在年創(chuàng)建的科技術(shù)語。我們除去源碼校驗函數(shù)部分,從最終返回的大的來看。這個返回值無法被識別。洋蔥模型我們來看源碼源碼每個都以作為參數(shù)進行注入,返回一個新的鏈。改變原始組數(shù),是一種副作用。 @(Redux)[|用法|源碼] Redux 由Dan Abramov在2015年創(chuàng)建的科技術(shù)語。是受2014年Facebook的Flux架構(gòu)以及函數(shù)式編程語言Elm啟發(fā)。很快,Redux因其...
閱讀 3319·2021-11-16 11:45
閱讀 2670·2021-09-22 15:23
閱讀 575·2021-07-30 14:58
閱讀 470·2019-08-30 15:54
閱讀 2248·2019-08-29 16:19
閱讀 3028·2019-08-29 12:45
閱讀 949·2019-08-23 17:57
閱讀 1803·2019-08-23 17:54