您的第二个示例正是它的原因,尽管这实际上与柯里化无关。
功能组合允许您从更简单的功能中构建更复杂的功能。
想象一下,您有一些需要排序的数据类型,比如说约会的集合。鉴于你已经有一个sortByDate
函数和一个reverse
函数,你可以sortByDateDescending
写成
var sortByDateDescending = function(appointments) {
return reverse(sortByDate(appointments));
}
或者在 ES6 中:
const sortByDateDescending = appointments => reverse(sortByDate(appointments));
这并没有错。compose
但是,如果您要使用助手编写它,它有几个优点:
var sortByDateDescending = compose(reverse, sortByDate);
首先,它显然更短,并且随着您添加更多功能,差异会变得更大,尤其是使用 es6 之前的代码。
但更重要的是,这使您可以专注于有意义的事情。您在这里组合功能;最终将通过的数据是目标,但是当您构建新功能时,它主要是分散注意力。
通过这种方式编写,您可以专注于正在发生的事情:您正在按日期对列表进行排序,然后您正在反转结果。
更专注于函数式编程的语言使这更加简单,使用不显眼的运算符而不是像compose
. 在 Haskell 中,等价物看起来像
sortByDateDescending = reverse . sortByDate
但是 Javascript 并没有提供那种优雅。我们能做的最好的事情就是创建类似compose
(或它的逆序双胞胎,pipe
.)的函数
我对 Ramda的介绍提供了更多以这种方式工作的示例。
顺便说一句,咖喱是完全不同的野兽。这是一种使在此类组合中重用函数变得更加容易的技术。但这主要是分散注意力。如果你有兴趣,我也有一个关于这个问题的帖子。