Native implementation of reduceRight in JavaScript is wrong

狂风中的少年 提交于 2019-12-06 07:35:45
Bergi

Doesn't it indeed make more sense for reduceRight to be implemented the way I did?

Maybe. However, the JavaScript array iterators do not come from a pure functional programming background.

Why is the native reduceRight not implemented the way I did?

Because it's simpler (easier to remember) to have the same parameter order, the accumulator always first.

The primitive operation on arrays is reduce, which iterates from 0 to n-1 as always. Only in Haskell with its recursively-built lists foldr makes more sense (has the build duality, works well lazily on infinite lists…). Notice how the naming is not reduce+reduceLeft

Then reduceRight does not inverse the fold operation, it just reverses the iteration order. This is also how it is typically explained in documentation and tutorials, for example in The Definitive Guide:

reduceRight() works just like reduce(), except that it processes the array from highest.

Also the first implementation of reduce/reduceRight (see Bug 363040) in Mozilla's array extras for JS 1.8 followed this approach: It just flipped start with end and negated the step value.

The notes of Dave Herman for the ES4 spec followed this line of thought. It does mention Haskell, but the whole document does not deal with the parameter order of the callback at all. Maybe the distinct order was lost in Haskells uncommon syntax, or the canonical type names so that both signatures began with (a -> b -> …. More discussion went into the missing thisObject parameter.

Some relevant excerpts:

The benefits [of the approach]:

  • just like Python => Python community mindshare
  • full generality of fold (left)
  • but also make the simple case, where the first element is the basis element, simpler

I'd guess most people find the left-to-right version of reduce more
intuitive, since they usually iterate over arrays from left to right. Plus that's what Python does.

I think it would also be important to provide a reduceRight as well,
since not every operation is associative, and sometimes people need to go from right to left.

And finally, that is what got into the EcmaScript spec:

Array extras: Spec it the way it is currently supported in FF

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!