萬(wàn)物皆可柯里化的Ramda.js及傳參詳解
引言
我們前段時(shí)間寫(xiě)過(guò)好幾篇關(guān)于 RxJS 的文章,RxJS api 操作符理解起來(lái)確實(shí)比較復(fù)雜,RxJS 是函數(shù)式編程中的 lodash 庫(kù),它消除了“時(shí)序”而帶來(lái)的困擾,它核心思想是:函數(shù)式 + 響應(yīng)式。
本篇, 要講的不是 RxJS,而是另外一個(gè)函數(shù)式編程庫(kù) Ramda.js ,它同樣也可以與 loadsh 對(duì)比理解,不過(guò)它的設(shè)計(jì)思路又不同了,它最大的特點(diǎn)是:所有函數(shù)都可以柯里化傳參!以此來(lái)踐行函數(shù)式編程思想。
往下看,后面我們就能明白:Ramda 所有 Api 都能柯里化的意義所在。
Function first,Data last
在 lodash 中,我們是這樣寫(xiě)的,
var square = n => n * n; _.map([4, 8], square)
參數(shù)在前,執(zhí)行函數(shù)在后。
而在 Ramda 中,強(qiáng)調(diào):函數(shù)在前,參數(shù)在后。
這樣做有什么好處呢?
就是為了更好實(shí)現(xiàn):柯里化??吕锘恍枰獏?shù)一個(gè)一個(gè)的在后追加
var R = require('ramda'); R.map(square, [4, 8]) // 等同于 var R = require('ramda'); R.map(square)([4, 8])
再舉個(gè)栗子:
var R = require('ramda'); const odd = x => x%2 === 1 const data = [3, 5, 6]; R.filter(odd, data); // [3, 5] // 等同于 R.filter(odd)(data); // [3, 5] // 也可以延遲調(diào)用 const filter1 = R.filter(odd); // filter1 等待參數(shù)的傳入 // 后續(xù)再傳入 data const filter2 = filter1(data)
如果不借用 Ramda.js , 需要自行實(shí)現(xiàn)柯里化,就會(huì)顯得麻煩:
const _curry = f => a => b => f(a, b) const odd = x => x%2 === 1 const _filter = _curry( (fn, arr) => arr.filter(fn) ); _filter(odd)([3,5,6]) // [3, 5]
Ramda 非常強(qiáng)調(diào):R.api(fn, data)
這樣的范式;
API
來(lái)看看 Ramda 有哪些神奇的、好用的、常用的 API~
- map
map 讓每個(gè)成員依次執(zhí)行通過(guò)某個(gè)函數(shù);
const double = x => x * 2; R.map(double, [1, 2, 3]); //=> [2, 4, 6] R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}
- filter
用于過(guò)濾;
const isEven = n => n % 2 === 0; R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4] R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}
- add
求和;
R.add(2, 3); //=> 5 R.add(7)(10); //=> 17
- multiply
求積;
R.multiply(2)(5) // 10
- compose
函數(shù)組合,從右到左;
R.compose(Math.abs, R.add(1), R.multiply(2))(-4) // |-4*2 + 1|,等于 7
- pipe
函數(shù)組合,從左到右;
var negative = x => -1 * x; var increaseOne = x => x + 1; var f = R.pipe(Math.pow, negative, increaseOne)(3,4); // -(3^4) + 1 ,等于 -80
- curry
將多個(gè)參數(shù)轉(zhuǎn)換為單個(gè)參數(shù)
const addFourNumbers = (a, b, c, d) => a + b + c + d; const curriedAddFourNumbers = R.curry(addFourNumbers); curriedAddFourNumbers(1, 2)(3)(4)
Ramda 還有其它豐富的 api,也可以結(jié)合 compose/pipe 自定義特定功能函數(shù),用這些方法來(lái)簡(jiǎn)化程序,讓代碼變成函數(shù)式風(fēng)格;
以上的例子都可在 jsrun.net/DTNKp/edit 可以在線運(yùn)行測(cè)試;
更多 Ramda api 可見(jiàn)文檔:ramda.cn/
以上就是萬(wàn)物皆可柯里化的Ramda.js詳解的詳細(xì)內(nèi)容,更多關(guān)于柯里化Ramda.js的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
bootstrap fileinput完整實(shí)例分享
這篇文章主要為大家分享文件上傳組件bootstrap fileinput完整實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11用javascript替換URL中的參數(shù)值示例代碼
本篇文章主要是對(duì)用javascript替換URL中的參數(shù)值示例代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01JS中產(chǎn)生標(biāo)識(shí)符方式的演變
本文記錄下JS中產(chǎn)生標(biāo)識(shí)符方式的演變,從ES5到ES6,ES5及其之前是一種方式,只包含兩種聲明(var/function),ES6則增加了一些產(chǎn)生標(biāo)識(shí)符的關(guān)鍵字,如 let、const、class。2015-06-06基于JavaScript實(shí)現(xiàn)數(shù)值型坐標(biāo)軸刻度計(jì)算算法(echarts的y軸刻度計(jì)算)
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)數(shù)值型坐標(biāo)軸刻度計(jì)算算法(echarts的y軸刻度計(jì)算),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,感興趣的朋友可以參考與一下2022-06-06微信小程序的數(shù)據(jù)存儲(chǔ)與Django等服務(wù)發(fā)送請(qǐng)求?講解
這篇文章主要為大家介紹了微信小程序的數(shù)據(jù)存儲(chǔ)與Django等服務(wù)發(fā)送請(qǐng)求講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04JavaScript實(shí)現(xiàn)棧結(jié)構(gòu)Stack過(guò)程詳解
這篇文章主要介紹了JavaScript實(shí)現(xiàn)棧結(jié)構(gòu)Stack過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03簡(jiǎn)單的js計(jì)算器實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何實(shí)現(xiàn)簡(jiǎn)單js計(jì)算器的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10javascript中獲取元素標(biāo)簽中間的內(nèi)容的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇javascript中獲取元素標(biāo)簽中間的內(nèi)容的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10