Search code examples
javascriptreducefoldleft

Can someone explain this foldl example to me in laymens terms?


I am trying to understand exactly how this function operates and cannot figure it out in my brain. Please can you show the step-by-step process of the code?

I've been sitting here trying to figure this example out in my head using a calculator on my computer and running through the code many many times in my head, but it just doesn't add up. Pun not intended.

constructor(values) {
  this.values = values || []
}

const list = new List([1,2,3,4])

expect(list.foldl((acc, el) => el / acc, 24)).toEqual(64);

foldl(fn, initialValue) {
  let acc = initialValue;
  for (let i in this.values) {
    acc = fn(acc, this.values[i]);

  }
  return acc; // 64... HOW??!
}

Okay here's how I run through it in my head. Please can you explain to me why I'm wrong, and show me what is correct in pseudocode as I've done below.

```
// accumulator is 24 and therefore we divide the first element of the array which is 1 by 24 which equals .041666667

// the accumulator now ACCUMULATES which means 24 plus .041666667 is equal to 24.041666667

// now the accumulator is 24.041666667 and we divide the second element of the array which is 2 by 24 which equals .083333333

// the accumulator which is 24.041666667 now adds .083333333 which equals 24.874999997

// now the accumulator is 24.874999997 and we divide the third element of the array which is 3 by 24.874999997 which equals .120603015 

and so on...

What am I missing here?


Solution

  • Accumulating doesn't mean adding. It means running the function that you passed into foldl. Also, the value of 24 is only used the first time; after that, the accumulation means that it uses the return value from last time. Here's the correct sequence of values:

    acc = 24
    el = 1
    acc = 1/24
    el = 2
    acc = 2/(1/24) = 48
    el = 3
    acc = 3/48 = 1/16
    el = 4
    acc = 4/(1/16) = 64