将reduce()与+运算符一起使用最简洁的方法是什么



情况:我想使用二进制加法调用reduce

理想的是简洁、语法优雅的东西,即

arr.reduce( + , 0 )

但这实际上并不像写的那样有效。我在网上看到的例子更像

arr.reduce( (a, b) => a+b, 0 )

这是有效的,但感觉应该有一个更容易、更";优雅的";做像二进制加法这样简单的事情的方法。

问题:是否有某种方法可以避免定义整个匿名函数来告诉reduce我想要二进制加法?

这表明,即使JavaScript可以启用函数式编程风格(在一定程度上(,JavaScript也不是函数式语言。

我认为你所拥有的已经足够好了。在这一点上,你能做的最好的事情就是尽可能清楚地表达你的意图(当然是YMMV(:

const add = (a, b) => a + b;
const sum = (...xs) => xs.reduce(add, 0);
sum(40, 1, 1);
// 42

JavaScript不是函数式语言吗

当然,这只是我的观点,但与Clojure或Haskell等其他语言不同,在JavaScript中,+不是一个函数,而是一个运算符,这意味着你不能将其分配给变量或将其作为参数传递。

在Haskell中,您可以添加两个数字,如下所示:

40 + 2

看起来+是一个运算符,但它实际上是一个(中缀(函数,您可以将其作为参数传递并部分应用:

foldl (+) 0 [40, 1, 1]
-- 42
map (+ 10) [40, 1, 1]
-- [50, 11, 11]

在Clojure中,您可以按照添加两个数字

(+ 40 2)
; 42

然而,在Clojure中,+实际上也是一个函数:

(reduce + 0 '(40 1 1))
; 42

然而,这并不是必要的,因为+无论如何都要处理一系列数字:

(+ 40 1 1)
; 42
(+ 39 1 1 1)
; 42
(+ 38 1 1 1 1)
; 42

如果您要多次使用reduce,尽管没有内置的方法,但有一种更优雅的方法可以使用它。将此添加到代码的底部

function add(a, b){
return total + num;
}

然后,当你想使用reduce函数时,添加这个

let i = arr.reduce(add)

简而言之,不,我不这么认为。

据我所知,运算符(作为表达式的一部分(不能用作函数参数,因为一旦定义了它们,就会对它们进行求值。

arr.reduce(+,0)的情况下,运行时将尝试评估+,而不是将其传递给reduce。

相反,您需要一种方法来区分定义调用,这正是您从函数中获得的语义。

正如@superJumbo所说,运算符不是javascript中的函数。这是不幸的,因为你不能真正受益于像haskell这样的语言的表达能力。

然而,javascript开发人员推出了旨在带来这种表达能力的库!Ramda和Sanctuary就是很好的例子。。。

const sum = R.reduce(R.add, 0);
console.log(
sum([1, 2, 3, 4, 5, 6, 7]),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>

或者,更简洁地说:

console.log(
R.sum([1, 2, 3, 4, 5, 6, 7]),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>

相关内容

最新更新