3 ms·
Fold/reduce is not a primitive in Clojure, Erlang, Haskell, SML, Mercury, or any other functional language I know (though it is a standard library function in a
by mbrubeck 17y ago
Fold/reduce is not a primitive in Clojure, Erlang, Haskell, SML, Mercury, or any other functional language I know (though it is a standard library function in all of them). Do you have any counter-examples?
Of course all functional programmers write the same tail-recursive implementation of "reduce." That's like observing that everyone uses a loop to implement "reduce" in an imperative language. It's the simple, straightforward way to do it. (And since folds are trivially implemented in any functional language with tail recursion, why would the language designer include them as a primitive?)
- ubernostrum 17y agoI took "primitive" to mean not only language syntax, but built-in functions which are so fundamental to programming in a given language that it's difficult to escape them. For, say, Haskell, that's quite true of folds.
- mbrubeck 17y agoI don't think it's true in Haskell at all. A fold is just walking a list with an accumulator. That's not weird or low-level; it's as common for Haskell programmers as loops and variables for C programmers. It actually took me a while (when first learning SML and Scheme) to realize I could use the built-in reduce functions more, instead of writing loops "by hand" all the time. It's also very common in Haskell to implement your own fold for various reasons. For example, in a simple 50-line text processing script[1], I defined a fold for a list-of-trees data structure without calling any builtin fold function[2]. [1]: http://github.com/mbrubeck/outline-grep http://github.com/mbrubeck/outline-grep [2]: http://github.com/mbrubeck/outline-grep/blob/master/OutlineGrep.lhs#L20 http://github.com/mbrubeck/outline-grep/blob/master/OutlineG... P.S. I like your blog, and huge thanks for Django!
- jrockway 17y agoActually, a fold is walking a Foldable with an accumulator :)