成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

翻譯連載 | 附錄 C:函數(shù)式編程函數(shù)庫(kù)-《JavaScript輕量級(jí)函數(shù)式編程》 |《你不知道的J

Miracle / 3310人閱讀

摘要:為了盡可能提升互通性,已經(jīng)成為函數(shù)式編程庫(kù)遵循的實(shí)際標(biāo)準(zhǔn)。與輕量級(jí)函數(shù)式編程的概念相反,它以火力全開(kāi)的姿態(tài)進(jìn)軍的函數(shù)式編程世界。

原文地址:Functional-Light-JS

原文作者:Kyle Simpson-《You-Dont-Know-JS》作者

關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是 CSS 里最閃耀的一瞥;總結(jié),是 JavaScript 中最嚴(yán)謹(jǐn)?shù)倪壿嫛=?jīng)過(guò)捶打磨練,成就了本書(shū)的中文版。本書(shū)包含了函數(shù)式編程之精髓,希望可以幫助大家在學(xué)習(xí)函數(shù)式編程的道路上走的更順暢。比心。

譯者團(tuán)隊(duì)(排名不分先后):阿希、blueken、brucecham、cfanlife、dail、kyoko-df、l3ve、lilins、LittlePineapple、MatildaJin、冬青、pobusama、Cherry、蘿卜、vavd317、vivaxy、萌萌、zhouyao

JavaScript 輕量級(jí)函數(shù)式編程 附錄 C:函數(shù)式編程函數(shù)庫(kù)

如果您已經(jīng)從頭到尾通讀了此書(shū),請(qǐng)花一分鐘的時(shí)間停下來(lái)回顧一下從第 1 章到現(xiàn)在的收獲。相當(dāng)漫長(zhǎng)的一段旅程,不是嗎?希望您已經(jīng)收獲了大量新知識(shí),并用函數(shù)式的方式思考你的程序。

在本書(shū)即將完結(jié)時(shí),我想給你提供一些關(guān)于使用官方函數(shù)式編程函數(shù)庫(kù)的快速指南。注意這并不是一個(gè)詳細(xì)的文檔,而是將你在結(jié)束“輕量級(jí)函數(shù)式編程”后進(jìn)軍真正的函數(shù)式編程時(shí)應(yīng)該注意的東西快速梳理一下。

如果有可能,我建議你不要做重新造輪子這樣的事情。如果你找到了一個(gè)能滿(mǎn)足你需求的函數(shù)式編程函數(shù)庫(kù),那么用它就對(duì)了。只有在你實(shí)在找不到合適的庫(kù)來(lái)應(yīng)對(duì)你面臨的問(wèn)題時(shí),才應(yīng)該使用本書(shū)提供的輔助實(shí)用函數(shù) —— 或者自己造輪子。

目錄

在本書(shū)第 1 章曾列出了一個(gè)函數(shù)式編程庫(kù)的列表,現(xiàn)在我們來(lái)擴(kuò)展這個(gè)列表。我們不會(huì)涉及所有的庫(kù)(它們之中有許多重復(fù)的內(nèi)容),但下面這些你應(yīng)該有所關(guān)注:

Ramda:通用函數(shù)式編程實(shí)用函數(shù)

Sanctuary:函數(shù)式編程類(lèi)型 Ramda 伴侶

lodash/fp:通用函數(shù)式編程實(shí)用函數(shù)

functional.js:通用函數(shù)式編程實(shí)用函數(shù)

Immutable:不可變數(shù)據(jù)結(jié)構(gòu)

Mori:(受到 ClojureScript 啟發(fā))不可變數(shù)據(jù)結(jié)構(gòu)

Seamless-Immutable:不可變數(shù)據(jù)助手

tranducers-js:數(shù)據(jù)轉(zhuǎn)換器

monet.js:Monad 類(lèi)型

上面的列表只列出了所有函數(shù)式編程庫(kù)的一小部分,并不是說(shuō)沒(méi)有在列表中列出的庫(kù)就不好,也不是說(shuō)列表中列出的就是最佳選擇,總之這只是 JavaScript 函數(shù)式編程世界中的一瞥。您可以前往這里查看更完整的函數(shù)式編程資源。

Fantasy Land(又名 FL)是函數(shù)式編程世界中十分重要的學(xué)習(xí)資源之一,與其說(shuō)它是一個(gè)庫(kù),不如說(shuō)它是一本百科全書(shū)。

Fantasy Land 不是一份為初學(xué)者準(zhǔn)備的輕量級(jí)讀物,而是一個(gè)完整而詳細(xì)的 JavaScript 函數(shù)式編程路線圖。為了盡可能提升互通性,F(xiàn)L 已經(jīng)成為 JavaScript 函數(shù)式編程庫(kù)遵循的實(shí)際標(biāo)準(zhǔn)。

Fantasy Land 與“輕量級(jí)函數(shù)式編程”的概念相反,它以火力全開(kāi)的姿態(tài)進(jìn)軍 JavaScript 的函數(shù)式編程世界。也就是說(shuō),當(dāng)你的能力超越本書(shū)時(shí),F(xiàn)L 將會(huì)成為你接下來(lái)前進(jìn)的方向。我建議您將其保存在收藏夾中,并在您使用本書(shū)的概念進(jìn)行至少 6 個(gè)月的實(shí)戰(zhàn)練習(xí)之后再回來(lái)。

Ramda (0.23.0)

摘自 Ramda 文檔:

Ramda 函數(shù)自動(dòng)地被柯里化。

Ramda 函數(shù)的參數(shù)經(jīng)過(guò)優(yōu)化,更便于柯里化。需要被操作的數(shù)據(jù)往往放在最后提供。

我認(rèn)為合理的設(shè)計(jì)是 Ramda 的優(yōu)勢(shì)之一。值得注意的是,Ramda 的柯里化形式(似乎大多數(shù)的庫(kù)都是這種形式)是我們?cè)诘?3 章中討論過(guò)的“松散柯里化”。

第 3 章的最后一個(gè)例子 —— 我們定義無(wú)值(point-free)工具函數(shù) printIf() —— 可以在 Ramda 中這樣實(shí)現(xiàn):

function output(msg) {
    console.log( msg );
}

function isShortEnough(str) {
    return str.length <= 5;
}

var isLongEnough = R.complement( isShortEnough );

var printIf = R.partial( R.flip( R.when ), [output] );

var msg1 = "Hello";
var msg2 = msg1 + " World";

printIf( isShortEnough, msg1 );            // Hello
printIf( isShortEnough, msg2 );

printIf( isLongEnough, msg1 );
printIf( isLongEnough, msg2 );            // Hello World

與我們?cè)诘?3 章中的實(shí)現(xiàn)相比有幾處不同:

我們使用 R.complement(..) 而不是 not(..)isShortEnough(..) 周?chē)陆ㄒ粋€(gè)否定函數(shù) isLongEnough(..)。

使用 R.flip(..) 而不是 reverseArgs(..) 函數(shù),值得一提的是,R.flip(..) 僅交換頭兩個(gè)參數(shù),而 reverseArgs(..) 會(huì)將所有參數(shù)反向。在這種情景下,flip(..) 更加方便,所以我們不再需要使用 partialRight(..) 或其他投機(jī)取巧的方式進(jìn)行處理。

R.partial(..) 所有的后續(xù)參數(shù)以單個(gè)數(shù)組的形式存在。

因?yàn)?Ramda 使用松散柯里化,因此我們不需要使用 R.uncurryN(..) 來(lái)獲得一個(gè)包含所有參數(shù)的 printIf(..)。如果我們這樣做了,就相當(dāng)于使用 R.uncurryN(2, ..) 包裹 R.partial(..) 進(jìn)行調(diào)用,這是完全沒(méi)有必要的。

Ramda 是一個(gè)受歡迎的、功能強(qiáng)大的庫(kù)。如果你想要在你的代碼中實(shí)踐 FP,從 Ramda 開(kāi)始是個(gè)不錯(cuò)的選擇。

Lodash/fp (4.17.4)

Lodash 是整個(gè) JS 生態(tài)系統(tǒng)中最受歡迎的庫(kù)。Lodash 團(tuán)隊(duì)發(fā)布了一個(gè)“FP 友好”的 API 版本 —— "lodash/fp"。

在第 8 章中,我們討論了合并獨(dú)立列表操作(map(..)、filter(..) 以及 reduce(..))。使用“l(fā)odash/fp”時(shí),你可以這樣做:

var sum = (x,y) => x + y;
var double = x => x * 2;
var isOdd = x => x % 2 == 1;

fp.compose( [
    fp.reduce( sum )( 0 ),
    fp.map( double ),
    fp.filter( isOdd )
] )
( [1,2,3,4,5] );                    // 18

與我們所熟知的 _. 命名空間前綴不同,“l(fā)odash/fp”將 fp. 定義為其命名空間前綴。我發(fā)現(xiàn)一個(gè)很有用的區(qū)別,就是 fp._. 更容易識(shí)別。

注意 fp.compose(..)(在常規(guī) lodash 版本中又名 _.flowRight(..))接受一個(gè)函數(shù)數(shù)組,而不是獨(dú)立的函數(shù)作為參數(shù)。

lodash 擁有良好的穩(wěn)定性、廣泛的社區(qū)支持以及優(yōu)秀的性能,是你探索 FP 世界時(shí)的堅(jiān)實(shí)后盾。

Mori (0.3.2)

在第 6 章中,我們已經(jīng)快速瀏覽了一下 Immutable.js 庫(kù),該庫(kù)可能是最廣為人知的不可變數(shù)據(jù)結(jié)構(gòu)庫(kù)了。

讓我們來(lái)看一下另一個(gè)流行的庫(kù):Mori。Mori 設(shè)計(jì)了一套與眾不同(從表面上看更像函數(shù)式編程)的 API:它使用獨(dú)立的函數(shù)而不直接在值上操作。

var state = mori.vector( 1, 2, 3, 4 );

var newState = mori.assoc(
    mori.into( state, Array.from( {length: 39} ) ),
    42,
    "meaning of life"
);

state === newState;                        // false

mori.get( state, 2 );                    // 3
mori.get( state, 42 );                    // undefined

mori.get( newState, 2 );                // 3
mori.get( newState, 42 );                // "meaning of life"

mori.toJs( newState ).slice( 1, 3 );    // [2,3]

這是一個(gè)指出關(guān)于 Mori 的一些有趣的事情的例子:

使用 vector 而不是 list(你可能會(huì)想用的),主要是因?yàn)槲臋n說(shuō)它的行為更像 JavaScript 中的數(shù)組。

不能像在操作原生 JavaScript 數(shù)組那樣在任意位置設(shè)置值,在 vector 結(jié)構(gòu)中,這將會(huì)拋出異常。因此我們必須使用 mori.into(..),傳入一個(gè)合適長(zhǎng)度的數(shù)組來(lái)擴(kuò)展 vector 的長(zhǎng)度。在上例中,vector 有 43 個(gè)可用位置(4 + 39),所以我們可以在最后一個(gè)位置(索引為 42)上寫(xiě)入 "meaning of life" 這個(gè)值。

使用 mori.into(..) 創(chuàng)建一個(gè)較大的 vector,再用 mor.assoc(..) 根據(jù)這個(gè) vector 創(chuàng)建另一個(gè) vector 的做法聽(tīng)起來(lái)效率低下。但是,不可變數(shù)據(jù)結(jié)構(gòu)的好處在于數(shù)據(jù)不會(huì)進(jìn)行克隆,每次“改變”發(fā)生,新的數(shù)據(jù)結(jié)構(gòu)只會(huì)追蹤其與舊數(shù)據(jù)結(jié)構(gòu)的不同之處。

Mori 受到 ClojureScript 極大的啟發(fā)。如果您有 ClojureScript 編程經(jīng)驗(yàn),那您應(yīng)該對(duì) Mori 的 API 感到非常熟悉。由于我沒(méi)有這種編程經(jīng)驗(yàn),因此我感覺(jué) Mori 中的方法名有點(diǎn)奇怪。

但相比于在數(shù)據(jù)上直接調(diào)用方法,我真的很喜歡調(diào)用獨(dú)立方法這樣的設(shè)計(jì)。Mori 還有一些自動(dòng)返回原生 JavaScript 數(shù)組的方法,用起來(lái)非常方便。

總結(jié)

JavaScript 不是作為函數(shù)式編程語(yǔ)言來(lái)特別設(shè)計(jì)的。不過(guò)其自身的確擁有很多對(duì)函數(shù)式編程非常友好基礎(chǔ)語(yǔ)法(例如可作為變量的函數(shù)、閉包等)。本章提及的庫(kù)將使你更方便的進(jìn)行函數(shù)式編程。

有了本書(shū)中函數(shù)式編程概念的武裝,相信你已經(jīng)準(zhǔn)備好開(kāi)始處理現(xiàn)實(shí)世界的代碼了。找一個(gè)優(yōu)秀的函數(shù)式編程庫(kù)來(lái)用,然后練習(xí),練習(xí),再練習(xí)。

就是這樣了。我已經(jīng)將我目前所知道的知識(shí)分享給你了。我在此正式認(rèn)證您為“JavaScript 輕量級(jí)函數(shù)式編程”程序員!好了,是時(shí)候結(jié)束我們一起學(xué)習(xí) FP 這部分的“章節(jié)”了,但我的學(xué)習(xí)之旅還將繼續(xù)。我希望,你也是!

【上一章】翻譯連載 | 附錄 B: 謙虛的 Monad-《JavaScript輕量級(jí)函數(shù)式編程》 |《你不知道的JS》姊妹篇

iKcamp原創(chuàng)新書(shū)《移動(dòng)Web前端高效開(kāi)發(fā)實(shí)戰(zhàn)》已在亞馬遜、京東、當(dāng)當(dāng)開(kāi)售。

iKcamp官網(wǎng):https://www.ikcamp.com
訪問(wèn)官網(wǎng)更快閱讀全部免費(fèi)分享課程:
《iKcamp出品|全網(wǎng)最新|微信小程序|基于最新版1.0開(kāi)發(fā)者工具之初中級(jí)培訓(xùn)教程分享》
《iKcamp出品|基于Koa2搭建Node.js實(shí)戰(zhàn)項(xiàng)目教程》
包含:文章、視頻、源代碼

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92391.html

相關(guān)文章

  • 翻譯連載 |《你不知道JS》姊妹篇 |《JavaScript 量級(jí)函數(shù)編程》- 引言&前言

    摘要:我稱(chēng)之為輕量級(jí)函數(shù)式編程。序眾所周知,我是一個(gè)函數(shù)式編程迷。函數(shù)式編程有很多種定義。本書(shū)是你開(kāi)啟函數(shù)式編程旅途的絕佳起點(diǎn)。事實(shí)上,已經(jīng)有很多從頭到尾正確的方式介紹函數(shù)式編程的書(shū)了。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson?。 禮ou-Dont-Know-JS》作者 譯者團(tuán)隊(duì)(排名不分先后):阿希、blueken、brucecham、...

    2bdenny 評(píng)論0 收藏0
  • 翻譯連載 |《你不知道JS》姊妹篇 |《JavaScript 量級(jí)函數(shù)編程》- 第 1 章:

    摘要:所以我覺(jué)得函數(shù)式編程領(lǐng)域更像學(xué)者的領(lǐng)域。函數(shù)式編程的原則是完善的,經(jīng)過(guò)了深入的研究和審查,并且可以被驗(yàn)證。函數(shù)式編程是編寫(xiě)可讀代碼的最有效工具之一可能還有其他。我知道很多函數(shù)式編程編程者會(huì)認(rèn)為形式主義本身有助于學(xué)習(xí)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson?。 禮ou-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液...

    omgdog 評(píng)論0 收藏0
  • 翻譯連載 | 附錄 B: 謙虛 Monad-《JavaScript量級(jí)函數(shù)編程》 |《你不知道

    摘要:就像我寫(xiě)書(shū)的過(guò)程一樣,每個(gè)開(kāi)發(fā)者在學(xué)習(xí)函數(shù)式編程的旅程中都會(huì)經(jīng)歷這個(gè)部分。類(lèi)型在函數(shù)式編程中有一個(gè)巨大的興趣領(lǐng)域類(lèi)型論,本書(shū)基本上完全遠(yuǎn)離了該領(lǐng)域。在函數(shù)式編程中,像這樣涵蓋是很普遍的。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML...

    gaomysion 評(píng)論0 收藏0
  • 翻譯連載 | 附錄 A:Transducing(下)-《JavaScript量級(jí)函數(shù)編程》 |《

    摘要:譯者團(tuán)隊(duì)排名不分先后阿希冬青蘿卜萌萌輕量級(jí)函數(shù)式編程附錄下組合柯里化這一步是最棘手的。該片段中的組合函數(shù)被稱(chēng)為,而不是。上一章翻譯連載附錄上輕量級(jí)函數(shù)式編程你不知道的姊妹篇原創(chuàng)新書(shū)移動(dòng)前端高效開(kāi)發(fā)實(shí)戰(zhàn)已在亞馬遜京東當(dāng)當(dāng)開(kāi)售。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著...

    bluesky 評(píng)論0 收藏0
  • 翻譯連載 | 附錄 A:Transducing(上)-《JavaScript量級(jí)函數(shù)編程》 |《

    摘要:我不會(huì)把嚴(yán)格的稱(chēng)為輕量級(jí)函數(shù)式編程,它更像是一個(gè)頂級(jí)的技巧。實(shí)際上,我認(rèn)為這是你掌握了輕量級(jí)函數(shù)式編程后可以做的最好的例證之一。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是 CSS 里最閃耀的一瞥;總結(jié),是 ...

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

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

0條評(píng)論

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