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