

Curried Javascript Functions - ccarpenterg
http://javascript.crockford.com/www_svendtofte_com/code/curried_javascript/index.html

======
apu
If you already know all about higher-order programming and just want a
javascript library with all the haskell/ML-style goodness, I highly recommend
O. Steele's Functional library:
<http://osteele.com/sources/javascript/functional/>

If nothing else, then his lambda() implementation with strings should be
enough to convince you to use it.

------
jganetsk
Here's an implementation that I think is shorter, simpler to understand,
easier to use, and doesn't require modifying existing functions for
currification

    
    
      function curry(fn) {
        var wrappedFnMaker = function(accArgs) {
            return function() {
                var effectiveArgs = accArgs.concat(Array.prototype.slice.call(arguments));
                if (effectiveArgs.length >= fn.length) {
                    return fn.apply(this, effectiveArgs);
                } else {
                    return wrappedFnMaker(effectiveArgs);
                }
            };
        }
        return wrappedFnMaker([]);
      }
    
      add = curry(function(a,b,c) { return a + b + c; });

~~~
marcmarc
Here's my take:

    
    
      function curry(fn, args) {
        if (typeof args == "undefined" || args.length < fn.length)
          return function() {
    	if (typeof args == "undefined")
    	  args = [];
    	return curry(fn, args.concat(Array.prototype.slice.call(arguments)));
          };
        return fn.apply(this, args);
      }
      var add = curry(function(a, b, c) { return a + b + c;});

~~~
shaunxcode
Here is curry in php 5.3

    
    
      function curry(){
        $args = func_get_args();
        $fn = array_shift($args);
        return function() use(&$fn, &$args) {
            $nargs = func_get_args();
            foreach($nargs as $narg) $args[] = $narg;
            return call_user_func_array($fn, $args);
        };
      }
    
      $add20 = curry(function($a, $b){return $a + $b;}, 20);
    
      echo $add20(5); #25

------
bodhi
What's the deal with the stuff in the footer of this page? "The original page
disappeared a couple of years ago. This is an unauthorized copy." It links to
<http://www.svendtofte.com/code/curried_javascript/> which I guess is the
original article?

------
troels
Oldie but goodie. If you liked that, you might like this too: [Higher Order
Programming in Javascript](<http://w3future.com/html/stories/hop.xml>)

------
axod
Currying looks horrible IMHO. It's like goto but worse. Can anyone give a real
life example of why it's useful or desired?

------
ilyak
Prototype has curry() and bind() methods on functions for some time.

<http://prototypejs.org/api/function>

String.prototype.splitOnSpaces = String.prototype.split.curry(" "); "foo bar
baz thud".splitOnSpaces(); //-> ["foo", "bar", "baz", "thud"]

~~~
lhorie
This:

    
    
      "foo bar baz thud".splitOnSpaces(); //-> ["foo", "bar", "baz", "thud"]
    

can be written like this:

    
    
      $w("foo bar baz thud")

