currying functions
Currando funciones en javascript ja, esto es un tema avanzado asi que a todos los que se aburren mucho con mis otros post les comento que este les va a encantar.
que son las curried functions. Simple son funciones que si reciben menos paramtros de los que deberian recibir simplemente se compilan a si mismas con los parametros que recibieron y devuelven una función que solo necesita un parametro para terminar su ejecución.
Veamos un ejemplo simple
supongamos que la funcion myFunc suma dos parametros
bien ahora veamos como implementar esta funcion
No es mucho mas complicada, pero tampoco muy generica verdad? bueno
podemos encontrar una solución mucho mas elegante en la siguiente funcion
como la usamos?
Sin embargo esta funcion no nos provee precompilación que es la verdadera gracia de curriar funciones, solo sirve para verse bonita.
pero si quieren saber mas sobre curried functions en javascript, les recomiendo que visiten este link y vean el algoritmo de Horspool precompilado en javascript
que son las curried functions. Simple son funciones que si reciben menos paramtros de los que deberian recibir simplemente se compilan a si mismas con los parametros que recibieron y devuelven una función que solo necesita un parametro para terminar su ejecución.
Veamos un ejemplo simple
supongamos que la funcion myFunc suma dos parametros
alert(myFunc(2,2)); // devuelve 4
var adds4 = myFunc(4); // adds4, es ahora una función,
// que le suma 4, a lo que reciba de argumento.
alert(adds4(5)); // devuelve 9.
bien ahora veamos como implementar esta funcion
function add(a, b) {
if (arguments.length < 1) {
return add;
} else if (arguments.length < 2) {
return function(c) {
return a + c
}
} else {
return a + b;
}
}
No es mucho mas complicada, pero tampoco muy generica verdad? bueno
podemos encontrar una solución mucho mas elegante en la siguiente funcion
function curry(func,args,space) {
var n = func.length - args.length; //arguments still to come
var sa = Array.prototype.slice.apply(args); // saved accumulator array
function accumulator(moreArgs,sa,n) {
var saPrev = sa.slice(0); // to reset
var nPrev = n; // to reset
for(var i=0;i<moreArgs.length;i++,n--) {
sa[sa.length] = moreArgs[i];
}
if ((n-moreArgs.length)<=0) {
var res = func.apply(space,sa);
// reset vars, so curried function can be applied to new params.
sa = saPrev;
n = nPrev;
return res;
} else {
return function (){
// arguments are params, so closure bussiness is avoided.
return accumulator(arguments,sa.slice(0),n);
}
}
}
return accumulator([],sa,n);
}
como la usamos?
function add (a,b,c){
if (arguments.length < this.add.length) {
return curry(this.add,arguments,this);
}
return a+b+c;
}
Sin embargo esta funcion no nos provee precompilación que es la verdadera gracia de curriar funciones, solo sirve para verse bonita.
pero si quieren saber mas sobre curried functions en javascript, les recomiendo que visiten este link y vean el algoritmo de Horspool precompilado en javascript
Comentarios
Publicar un comentario