Curry

and the hunt for for

Kass kod

  • namngivning
  • loopar
  • "glue code"
  • sidoeffekter

Namngivning

Loopar

"Glue code"

Sidoeffekter

var multiply = function(x, y){
  return x*y;
};

var triple = function(number){
  return multiply(3, number);
}

console.log(triple(5)); 
// 15

var numbers = [1, 2, 3];

var tripleNumbers = [];
for(var i = 0; i < numbers.length; i++){
  tripleNumbers.push(triple(numbers[i]));
}
console.log(tripleNumbers);
// [3, 6, 9]

//Gör om...
multiply = curry(multiply);
triple = multiply(3);

tripleNumbers = numbers.map(triple);

console.log(tripleNumbers);
// [3, 6, 9]

 "glue code"

 namngivning: i

 ingen "glue code"

 ingen loop

 loop-logik:  = 0 ,   < ,   ++ ,   push ,  [i]

 sidoeffekt: tripleNumbers

inga onödiga namn

sidoeffekt?

...call a function with fewer arguments than it expects. It returns a function that takes the remaining arguments.

Currying

korvstoppning vs. intelligens

var curry = function(fn){
  return function(){
    if(fn.length > arguments.length){
      var slice = Array.prototype.slice;
      var args = slice.apply(arguments);
      return function(){
        return fn.apply(null, args.concat(slice.apply(arguments)));
      };
    }
    return fn.apply(null, arguments);
  };
};
var multiply = curry(function(x, y){
  return x*y;
});

triple = multiply(3);
// triple == multiply(3, y)

console.log( triple(4) );
// multiply(3, 4);

Magic: currying

(

)

...compose

var compose = curry(function(f, g, x){
  return f(g(x));
});
var capitalize = function(word){
  return word.slice(0, 1).toUpperCase() + word.slice(1);
};

var addGreeting = curry(function(greeting, name){
  return greeting + " " + name + ", have some coffee";
});

var meetTheNewGuy = compose(addGreeting("Hoho"), capitalize);
console.log(meetTheNewGuy("gustav"));
// "Hoho Gustav, have some coffee"
var newGuys = ["gustav", "sture", "pierre"];
console.log(  newGuys.map(meetTheNewGuy)  );

// ...

...fork

var fork = curry(function(lastly, f, g, x){
  return lastly(f(x), g(x));
});
var divide = function(x, y){
  return x / y;
};

var sum = function(numbers){
  return numbers.reduce(function(a, b){
    return a + b;
  });
};

var theLength = function(numbersArray){
  return numbersArray.length;
};

var avg = fork(divide, sum, theLength);
console.log(avg([1, 2, 3, 4]));

// 2.5

...vad ska du googla ikväll?

Utmaning

...aldrig en for-loop igen

.map

.reduce

.filter

Curry - and the hunt for for

By Gustav Jorlöv

Curry - and the hunt for for

  • 171