gpt4 book ai didi

javascript - 使用 compose 有什么好处?

转载 作者:搜寻专家 更新时间:2023-11-01 04:53:55 25 4
gpt4 key购买 nike

我正在学习使用 Ramda 并遇到了 compose。但我无法理解它的目的

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

// vs

let value = calledThird( calledSecond( calledFirst('hello') ) );

是否纯粹是为了允许柯里化(Currying)?也许……

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

curried('hello');

还有其他用途吗?

最佳答案

你的第二个例子正是它的原因,尽管这实际上与柯里化(Currying)无关。

函数组合允许您从更简单的函数构建更复杂的函数。

假设您有一些需要排序的数据类型,比方说约会集合。鉴于您已经有一个 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。)

我的 introduction to Ramda帖子提供了更多以这种风格工作的例子。


顺便说一句,柯里化(Currying)是完全不同的野兽。这是一种使在此类组合中重用函数变得更加容易的技术。但这主要是分散注意力。有兴趣的我也have a post关于这个问题。

关于javascript - 使用 compose 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34878044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com