为什么我们将InitialValue赋予reduce()或类似?

时间:2017-12-19 18:43:38

标签: functional-programming

只是想知道,为什么 initialValue 被赋予函数式编程方法,比如reduce()?这样做的具体原因是什么?

不是将它放在函数的底部,也可以将它作为数组的第一个元素,因为它的行为相同,意思相同。 现在尝试学习函数式编程,但这一点没有意义。

3 个答案:

答案 0 :(得分:3)

  

也可以将它作为数组的第一个元素,因为它的行为相同,意思相同。

嗯,不。 reduce是一个泛型函数,可以使用任意数组,而不仅仅是那些具有我们期望值作为数组第一个元素的数组。最重要的情况是这里的空数组。

是的,可以将(unshift)初始值作为数组的第一个元素推送,然后在没有初始值的情况下调用reduce,然后再从数组中删除它并且你& #39; d有相同的结果。但这很麻烦,并且可能并不总是有效(例如使用不可变数组)。累加器甚至可能与数组元素的类型不同。

想想reduce的实现,以及它应该是抽象的模式:

function reduce(callback, iterable) {
    let val = ???;
    for (const element of iterable)
        val = callback(val, element);
    return val;
}

???作为参数是明智的选择。

答案 1 :(得分:1)

这样做的主要原因是需要正确处理零长度数据结构。

对于乘法,好的选择是1,对于加法,它是0.对于某些数据类型,它是空字符串,单位矩阵等等。这些是具有二进制运算的algebraic structures的零(或单位)。

通过这种安排,可以减少例外情况。类比,为什么我们需要使用有符号整数?它就在那里,所以我们可以更自然地表达减法,在5 - 7运算发生时没有例外。

大多数函数式编程都深深扎根于数学(代数)结构。对这些知识的了解确实有助于并简化查找美观和通用的解决方案。

此问题和答案也许有趣:Difference between fold and reduce?

答案 2 :(得分:0)

  

如果数组为空并且未提供initialValue,则抛出TypeError。

MDN web docs