2010-12-09 11 views
12

he implementado una función curry esta manera:función de curry JavaScript

function curry (fn) { 
    var slice = Array.prototype.slice, 
     args = slice.apply(arguments, [1]); 
    return function() { 
     fn.apply(null, args.concat(slice.apply(arguments))); 
    }; 
} 

Cuando utilizo la función anterior para hacer lo siguiente

function add (x, y) { 
    return x + y; 
} 

var inc = curry(add, 1); 
console.log(inc(10)); 

registra undefined. ¿No es 11 el resultado esperado? ¿Qué pasa con mi código?

Nota: Usando console.log(x, y) dentro de los registros de función 1 10. No entiendo por qué devuelve undefined.

+2

Actualmente no es curry, es una aplicación parcial. – jcubic

+0

Sé que estoy reviviendo un hilo muy antiguo, pero ¿qué significa aplicar '[1]' como argumento a 'arguments'? –

+1

¡Elimina la función pasada de la lista de argumentos! – monoceres

Respuesta

12

Te echa en falta return en tu función de curry.

I.e.

return function() { 
    return fn.apply(null, args.concat(slice.apply(arguments))); 
}; 

que parece funcionar :)

+0

Gracias, eso fue muy tonto (estúpido) de mi parte. – dheerosaur

+3

@dheerosaur - No te preocupes, todos somos estúpidos. :) – ChaosPandion

+0

Le sucede a todos :) –

10

Este es un ejemplo de la función de curry:

function curry(func) { 
    var initial_args = [].slice.apply(arguments, [1]); 
    var func_args_length = func.length; 

    function curried(args) { 
     if (args.length >= func_args_length) { 
      return func.apply(null, args); 
     } 

     return function() { 
      return curried(args.concat([].slice.apply(arguments))); 
     }; 
    } 

    return curried(initial_args); 
} 

Esta función crea una versión de curry curry de cualquier función. Puede aplicar parcialmente parámetros a la nueva función. Para cada aplicación parcial, devolverá una función que toma el resto de los parámetros. Una vez que se hayan aplicado todos los parámetros de la función original, devolverá un valor.

+1

+1 porque es una aplicación curry no parcial. – jcubic

Cuestiones relacionadas