成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

Miracle / 3368人閱讀

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

原文地址:Functional-Light-JS

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

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

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

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

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

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

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

目錄

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

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

Sanctuary:函數(shù)式編程類型 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 類型

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

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

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

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

Ramda (0.23.0)

摘自 Ramda 文檔:

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

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

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

第 3 章的最后一個例子 —— 我們定義無值(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

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

我們使用 R.complement(..) 而不是 not(..)isShortEnough(..) 周圍新建一個否定函數(shù) isLongEnough(..)

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

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

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

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

Lodash/fp (4.17.4)

Lodash 是整個 JS 生態(tài)系統(tǒng)中最受歡迎的庫。Lodash 團(tuán)隊(duì)發(fā)布了一個“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)一個很有用的區(qū)別,就是 fp._. 更容易識別。

注意 fp.compose(..)(在常規(guī) lodash 版本中又名 _.flowRight(..))接受一個函數(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 庫,該庫可能是最廣為人知的不可變數(shù)據(jù)結(jié)構(gòu)庫了。

讓我們來看一下另一個流行的庫: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]

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

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

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

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

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

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

總結(jié)

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

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

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

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/92391.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    Amos 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<