Giter VIP home page Giter VIP logo

Comments (2)

paldepind avatar paldepind commented on May 24, 2024

first, I just wanted to congradulate you on some very impressive work!

Thank you. Comments like that mean a lot 😄

I definitely agree that having the accumulator last is better when composing functions.

I realize that the documentation is quite poor in this regard, but in List foldr gives the accumulator last and foldl gives the accumulator first. That is the order used often in functional programming and I think it makes sense. The explanation I've read is to think of foldr as inserting the function between the elements in the list in a right-associative manner and then foldl doing that left-associative. This example shows what I mean.

const f = (n, m) => n - m;
foldr(f, 0, list(1, 2, 3, 4)); //=> f(1, f(2, f(3, f(4, 0)))) = (1 - (2 - (3 - (4 - 0))))
foldl(f, 0, list(1, 2, 3, 4)); //=> f(f(f(f(0, 1), 2), 3), 4) = ((((0 - 1) - 2) - 3) - 4)

In the foldr case the accumulator "naturally" appears as the second argument to the function and for foldl it is first.

The reduce function in Fantasy Land and Ramda gives the accumulator first which is ok as they are left folds. The reduceRight function in Ramda gives the accumulator as the second argument which is also great.

I think that in functional programming foldr should be the default fold. This is in contrast to JavaScript where the left folding reduce is the default fold people use. That is a big part of the reason why List prefers the names foldr and foldl instead of reduce and reduceRight.

What I'm trying to say is: List is currently consistent with Haskell and Ramda and I recommend using foldr which gives the nice argument order 😄

What do you think about that?

from list.

paldepind avatar paldepind commented on May 24, 2024

As explained above I think List's foldr/reduceRight and foldl/reduce is consistent with both typical FP conventions and Ramda in particular. So I'm going to close this issue. Feel free to open it @wishfoundry if you disagree 😄

from list.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.