2010-12-09 113 views
12

我实现了一个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))); 
    }; 
} 

当我使用上述功能做以下

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

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

它记录undefined。预期产量是不是11?我的代码有什么问题?

注:使用console.log(x, y)里面的add功能日志1 10。我不明白它为什么会返回undefined

+2

其实不是咖喱,它是部分应用。 – jcubic 2013-09-20 19:55:19

+0

我知道我正在恢复一个非常旧的线程,但是将`[1]`作为参数应用于`arguments`是做什么的? – 2013-12-31 14:54:19

+1

它从参数列表中删除传递的函数! – monoceres 2014-02-26 15:01:29

回答

12

您在咖喱功能中缺少return

I.e.

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

,似乎工作:)

10

这是咖喱函数的例子:

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); 
} 

这个咖喱功能创建的任何功能的咖喱版本。您可以部分将参数应用于新功能。对于每个部分应用程序,它将返回一个采用其余参数的函数。一旦应用了原始函数的所有参数,它将返回一个值。