2010-12-09 89 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); 
} 

這個咖喱功能創建的任何功能的咖喱版本。您可以部分將參數應用於新功能。對於每個部分應用程序,它將返回一個採用其餘參數的函數。一旦應用了原始函數的所有參數,它將返回一個值。