翻译连载 | 附录 C:函数式编制程序函数库-《JavaScript轻量级函数式编制程序》 |《你不通晓的JS》姊妹篇

有关译者:那是2个流动着沪江血液的纯粹工程:认真,是 HTML
最加强的梁柱;分享,是 CSS 里最闪亮的一瞥;计算,是 JavaScript
中最谨慎的逻辑。经过捶打演练,成就了本书的中文版。本书包涵了函数式编程之精华,希望能够帮忙大家在上学函数式编制程序的征程上走的更顺畅。比心。

翻译团队(排行不分先后):阿希bluekenbrucechamcfanlifedailkyoko-dfl3velilinsLittlePineappleMatildaJin冬青pobusamaCherry萝卜vavd317vivaxy萌萌zhouyao

JavaScript 轻量级函数式编制程序

附录 C:函数式编制程序函数库

若果您曾经起头到尾通读了此书,请花一分钟的大运停下来回看一下从第 1
章到将来的得到。非凡漫长的一段旅程,不是吗?希望您已经获取了大气新知识,并用函数式的方法考虑你的主次。

在本书即将终结时,笔者想给您提供一些有关选择官方函数式编制程序函数库的长足指南。注意那并不是二个详尽的文书档案,而是将你在告竣“轻量级函数式编制程序”后进军真正的函数式编制程序时应该注意的东西非常快梳理一下。

假如有大概,作者建议您不要做重新造轮子那样的事体。假如你找到了二个能满足你要求的函数式编制程序函数库,那么用它就对了。唯有在你其实找不到合适的库来应对您面临的题目时,才应该使用本书提供的佑助实用函数
—— 或然自身造轮子。

目录

在本书第 1
章曾列出了贰个函数式编制程序库的列表,未来我们来扩大这么些列表。大家不会涉及全数的库(它们之中有为数不少再次的剧情),但下边那个你应有有所关心:

地方的列表只列出了具有函数式编程库的一小部分,并不是说并未在列表中列出的库就倒霉,也不是说列表中列出的就是最好选项,综上可得那只是
JavaScript
函数式编制程序世界中的一瞥。您可在此之前往这里翻看更完整的函数式编程能源。

Fantasy Land(又名
FL)是函数式编制程序世界中十分第二的求学能源之一,与其说它是二个库,不如说它是一本百科全书。

Fantasy 马丁 不是一份为初学者准备的轻量级读物,而是七个完好无损而详尽的
JavaScript 函数式编制程序路线图。为了尽量升高互通性,FL 已经变成
JavaScript 函数式编制程序库遵循的实在标准。

Fantasy Bugatti 与“轻量级函数式编程”的概念相反,它以火力全开的神态进军
JavaScript 的函数式编制程序世界。也正是说,当您的力量当先本书时,FL
将会变成你接下去发展的趋向。笔者建议您将其保存在深藏夹中,并在你使用本书的定义举行至少
6 个月的实战练兵过后再重回。

Ramda (0.23.0)

摘自 Ramda 文档:

Ramda 函数自动地被柯里化。

Ramda
函数的参数经过优化,更便宜柯里化。须要被操作的数码往往放在最终提供。

小编觉得合理的陈设性是 Ramda 的优势之一。值得注意的是,Ramda
的柯里化方式(如同超越54%的库都是那种样式)是大家在第 3
章中斟酌过的“松散柯里化”。

第 3 章的末梢二个例子 —— 大家定义无值(point-free)工具函数 printIf()
—— 能够在 Ramda 中那样实现:

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 章中的完结相比较有几处区别:

  • 咱俩选拔 R.complement(..) 而不是 not(..)isShortEnough(..)
    周围新建二个矢口否认函数 isLongEnough(..)

  • 使用 R.flip(..) 而不是 reverseArgs(..)
    函数,值得一提的是,R.flip(..) 仅沟通头多个参数,而
    reverseArgs(..) 会将全体参数反向。在那种情景下,flip(..)
    尤其有利于,所以大家不再必要选拔 partialRight(..)
    或别的投机取巧的艺术展开始拍录卖。

  • R.partial(..) 全体的接轨参数以单个数组的样式存在。

  • 因为 Ramda 使用松散柯里化,由此大家不必要接纳 R.uncurryN(..)
    来获得二个饱含全数参数的
    printIf(..)。假使大家这么做了,就一定于接纳 R.uncurryN(2, ..)
    包裹 R.partial(..) 进行调用,那是全然没有须求的。

Ramda 是二个受欢迎的、作用强大的库。假设你想要在你的代码中推行 FP,从
Ramda 伊始是个不错的选项。

Lodash/fp (4.17.4)

Lodash 是整整 JS 生态系统中最受欢迎的库。Lodash 团队发表了1个“FP
友好”的 API 版本 ——
“lodash/fp”

在第 8 章中,大家谈谈了联合独立列表操作(map(..)filter(..) 以及
reduce(..))。使用“lodash/fp”时,你可以如此做:

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

与我们所熟谙的 _. 命名空间前缀分裂,“lodash/fp”将 fp.
定义为其取名空间前缀。我发现3个很有用的区分,正是 fp._.
更易于辨别。

注意 fp.compose(..)(在例行 lodash 版本中又名
_.flowRight(..))接受3个函数数组,而不是独立的函数作为参数。

lodash 拥有能够的平安、广泛的社区支持以及优良的品质,是您探索 FP
世界时的稳固后盾。

Mori (0.3.2)

在第 6 章中,大家早已迅速浏览了一下 Immutable.js
库,该库或然是最显赫的不可变数据结构库了。

让大家来看一下另多少个风靡的库:Mori。Mori设计了一套特种(从表面上看更像函数式编制程序)的
API:它选用独立的函数而不直接在值上操作。

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]

那是三个提议关于 Mori 的片段幽默的业务的事例:

  • 使用 vector 而不是
    list(你可能会想用的),重假设因为文书档案说它的行事更像 JavaScript
    中的数组。

  • 不能够像在操作原生 JavaScript 数组那样在任意地方设置值,在 vector
    结构中,那将会抛出卓殊。由此大家务必使用
    mori.into(..),传入二个相当长度的数组来扩充 vector
    的长短。在上例中,vector 有 43 个可用地方(4 +
    39),所以我们可以在最终三个地方(索引为 42)上写入
    "meaning of life" 这个值。

  • 使用 mori.into(..) 创造3个较大的 vector,再用 mor.assoc(..)
    依据那一个 vector 成立另四个 vector
    的做法听起来作用低下。可是,不可变数据结构的便宜在于数量不会进行克隆,每一回“改变”产生,新的数据结构只会追踪其与旧数据结构的差异之处。

Mori 受到 ClojureScript 一点都不小的诱导。要是您有 ClojureScript
编制程序经验,这你应该对 Mori 的 API
感到游刃有余。由于自家并未那种编制程序经验,由此笔者觉得 Mori中的方法名有点奇怪。

但比较之下于在数据上一贯调用方法,小编实在很喜欢调用独立方法这么的规划。Mori还有局地活动重临原生 JavaScript 数组的法门,用起来拾叁分便宜。

总结

JavaScript
不是作为函数式编制程序语言来特别规划的。但是其本人的确具有众多对函数式编制程序分外要好基础语法(例如可看成变量的函数、闭包等)。本章提及的库将使你更便利的展开函数式编制程序。

有了本书中等高校函授数式编制程序概念的配备,相信您早就准备好伊始拍卖具体世界的代码了。找1个优质的函数式编制程序库来用,然后练习,练习,再演练。

正是那样了。小编早已将自身当下所精通的知识分享给您了。作者在此规范认证您为“JavaScript
轻量级函数式编制程序”程序员!好了,是时候截至大家共同念书 FP
这部分的“章节”了,但本人的上学之旅还将继承。笔者梦想,你也是!

【上一章】翻译连载 | 附录 B: 谦虚的
Monad-《JavaScript轻量级函数式编制程序》
|《你不通晓的JS》姊妹篇

图片 1

iKcamp原创新书《移动Web前端高效开发实战》已在亚马逊(亚马逊(Amazon))、京东、当当开售。

iKcamp官网:https://www.ikcamp.com
做观众网更快阅读全部免费享受课程:
《iKcamp出品|全网最新|微信小程序|基于最新版1.0开发者工具之初级中学级培养和磨炼课程分享》
《iKcamp出品|基于Koa2搭建Node.js实战项目教程》
包含:文章、视频、源代码
图片 2