Currying Functions

What tasty thing is this?

The process of converting a function that accepts multiple arguments, into one that accepts a single argument, by binding some of the arguments into the original function.

function multiply(op1, op2){
  return op1*op2;
}

var times5 = curry(multiply, 5);

var product = times5(4); // 20

Why Should we Curry?

To understand every function as taking

at most one argument.

 

To stay DRY when invoking functions that use the same arguments many times.

function tax(percent, amount){
  return Math.round(amount * percent)/100;
}
var taxOf110InHawaii = tax(4.712, 110); // 5.18

var hiTax = curry(tax, 4.712);
taxOf110InHawaii = hiTax(110); // 5.18

Manually Currying

Write a function that returns another function that accesses the argument of the original function.

The original function arguments change the result of the returned function when its invoked.

function add(op1){
  return function(op2){
    return op1 + op2;
  }
}

var add5 = add(5); // a function that adds 5

var sumOf5and4 = add5(4); // 9

var shortHand = add(5)(4); // 9

Using Curry Helper

Use a helper function to convert functions into a curried function that accepts a single argument.

function curry(fn) {
  var args = Array.prototype.slice.call(arguments, 1);
  return function () {
    return fn.apply(this, args.concat(
      Array.prototype.slice.call(arguments, 0)
    ));
  };
}

convert a function

function concat (head, tail){
  return head + tail;
}

var greet = curry(concat,'Hello ');

greet('Jason'); // Hello Jason

Using Lo-Dash Curry Helper

Use lo-dash's partial() function to convert functions into a curried function that accepts a single argument.

var _ = require('lodash');

function concat (head, tail){
  return head + tail;
}

var greet = _.partial(concat,'Hello ');

greet('Jon'); // Hello Jon

Currying Functions

By Jon Borgonia

Currying Functions

basic currying in javascript

  • 1,963