使用撰写有什么好处?

tho*_*ter 4 javascript functional-programming ramda.js

我正在学习使用Ramda,并且遇到了写作.但我无法理解它的目的

let value = R.compose( calledThird, calledSecond, calledFirst('hello') );

// vs

let value = calledThird( calledSecond( calledFirst('hello') ) );
Run Code Online (Sandbox Code Playgroud)

是纯粹允许currying吗?也许...

let curried = R.compose( calledThird, calledSecond, calledFirst );

curried('hello');
Run Code Online (Sandbox Code Playgroud)

还有其他目的吗?

Sco*_*yet 11

你的第二个例子正是它的原因,尽管这实际上与currying无关.

功能组合允许您使用更简单的功能构建更复杂的功能.

想象一下,你有一些你需要排序的数据类型,让我们说一组约会.鉴于您已经拥有一个sortByDate函数和一个reverse函数,您可以编写sortByDateDescending

var sortByDateDescending = function(appointments) {
    return reverse(sortByDate(appointments));
}
Run Code Online (Sandbox Code Playgroud)

或者在ES6中:

const sortByDateDescending = appointments => reverse(sortByDate(appointments));
Run Code Online (Sandbox Code Playgroud)

这没什么不对.但是如果你用compose帮助器编写它,它有几个优点:

var sortByDateDescending = compose(reverse, sortByDate);
Run Code Online (Sandbox Code Playgroud)

首先,它显然更短,并且随着您添加更多功能,差异将变得更加充实,特别是使用pre-es6代码.

但更重要的是,这可以让你专注于有意义的事情.你在这里组合功能 ; 最终将通过的数据是目标,但是当您构建新功能时,它主要是分散注意力.

通过这种方式编写,您可以专注于正在发生的事情:您按日期对列表进行排序,然后您正在反转结果.

更加专注于函数式编程的语言使这个更简单,使用一个不显眼的运算符而不是像这样的函数compose.在Haskell中,等价物看起来像

sortByDateDescending = reverse . sortByDate
Run Code Online (Sandbox Code Playgroud)

但Javascript并没有提供那种优雅.我们能做的最好的事情就是创建像compose(或者它的顺序反转的双胞胎,... pipe)这样的函数.

对Ramda帖子的介绍提供了更多以这种方式工作的例子.


顺便说一句,干脆是一个完全不同的野兽.这种技术使得在这种组合物中重用功能变得容易得多.但这主要是分散注意力.如果你有兴趣,我也有一个关于这个问题的帖子.