最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript fold reduce functional programming - Stack Overflow

programmeradmin4浏览0评论

In Javascript there is reduce function which takes function and array, map over the array and return whatever the function return.

For example:

[1, 2, 3].reduce(function(acc, x) {
  acc += x 
  return acc;
}, 0); // 6 

In Haskell there is fold which for me do the same:

foldl (+) 0 [1,2,3]  -> 6

If i want to create that kind of function as library is it safe to call it fold instead of reduce and is there any difference between the two.

Does both functions the same except the name or there is some difference

I demonstrate with different languages because Js doesnt have foldl function.

In Javascript there is reduce function which takes function and array, map over the array and return whatever the function return.

For example:

[1, 2, 3].reduce(function(acc, x) {
  acc += x 
  return acc;
}, 0); // 6 

In Haskell there is fold which for me do the same:

foldl (+) 0 [1,2,3]  -> 6

If i want to create that kind of function as library is it safe to call it fold instead of reduce and is there any difference between the two.

Does both functions the same except the name or there is some difference

I demonstrate with different languages because Js doesnt have foldl function.

Share Improve this question edited Feb 14, 2024 at 17:58 Jonas 129k102 gold badges327 silver badges405 bronze badges asked Jun 24, 2018 at 13:01 user2693928user2693928
Add a ment  | 

2 Answers 2

Reset to default 6

Naming is inconsistent, and depends on the language.

In some contexts like Kotlin, reduce doesn't take an initial value, but fold does. In Haskell, there's foldl and foldl1 to differentiate between the two kinds. In Clojure, the same function reduce has different overloads for taking an initial value, or not taking one.

They're basically describing the same concept, and I've never found any clear difference between the two names.

Another perspective would be: reduce returns a scalar value while fold returns a function:

function dyadic(x, y) {
    return x + y;
};

initialValue = 0;

a_list = [1, 2, 3];

// --------- REDUCE -----------------------------
// reduce returns a scalar value:
console.log(a_list.reduce(dyadic, initialValue));

// --------- FOLD -------------------------------
// fold returns a polyadic function:
function fold(d_func, initialValue) {
    return function (...list) {
        return list.reduce(d_func, initialValue);
    };
};

// using fold to build the polyadic function build_sum:
build_sum = fold(dyadic, initialValue);
// finally obtain the scalar value by calling built function:
console.log(build_sum(...a_list));



// or using arrow notation:
dyadic2 = (x, y) => x + y;
fold2 = (d_func, initialValue) => (...list) => list.reduce(d_func, initialValue);
build_sum2 = fold2(dyadic2, initialValue);
console.log(build_sum2(...a_list));
发布评论

评论列表(0)

  1. 暂无评论