| I don't think I understand the point you're making. I just tested it, and empirically your assertion is incorrect: // this makes a linked list ten million and one elements long, from zero to ten million val longList = (0 to 10000000).toList // this adds the elements longList.foldRight(0)({ case (l, r) => l + r}) This does not stack overflow. You write: >> a plain fold has the exact same inputs and outputs as foldLeft or foldRight but if you use fold over a collection of type T with the fold function in Scala, the result must be of type T. Fold left and fold right don't have this constraint. Further, this fold is only coherent if the operation is commutative, because it doesn't happen in any particular order. You can add integers in any order to make the same sum, but you can't add pages of a PDF in any order to make a PDF. Framed via recursion schemes, I'm pretty sure foldLeft can be viewed as a catamorphism where foldRight is an anamorphism. You're consuming the tree from different directions. They may have the same domain and codomain (I'm a little hazy on that) but they're not apparently the same function. y = 2x and y = 3x both have the same domain and codomain, right? But the difference between them isn't aesthetic. |