我正在嘗試創建curry function,它可以應用於任何函數並返回另一個函數,並應用一個參數。 屬性,我想有:javascript currying
- 如果函數只有一個參數,咖喱函數返回值: F(一);咖喱(f,x)= f(x);
- 如果函數有很多參數currey應該重試curry函數: g(a1,a2,..,aN);咖喱(g,x)= g2(a2,..,aN):g2(a2,.. aN)= g(x,a2,...,aN)
- curry函數的長度運算應該「需要」 g.length = N =>咖喱(G,X)。長度= N-1
有一個在原型框架咖喱和討論在one blog的一些實施方式。但是這個實現並不好,因爲它對於只有一個參數(1)的函數不起作用,並且返回的函數'length'屬性爲0(3)。
針對第一屬性有一個簡單的實現:
function curry(f,x) {
if (f.length == 1) return f(x);
...
}
但我不知道如何與第三規則的工作,即函數可以作爲constucted內部函數,因爲會有一個嵌套詞法環境和將能夠使用f:
function curry(f,x) {
return function() { ... }
}
但在這種情況下,我將不再能夠明確地設置參數。 在另一方面功能可與「新功能」的語句來構建,水木清華這樣的:
function curry(f,x) {
var args = [];
for (var i=1; i<f.length; i++) {
args.push('a'+i);
}
var sa = args.join();
return new Function(sa,"return f(x,"+sa+")");
}
但在這種情況下,f和X將未綁定的,因爲匿名函數將在 全球詞法環境中創建。
所以問題:
- 有沒有辦法與功能關鍵字生成功能時,明確地設置參數算什麼?
- 有沒有一種方法可以設置使用'new Function'語句創建的函數環境?
- 我們有辦法以任何其他方式解決我的問題嗎?
僅僅因爲一個函數被*聲明爲一個參數並不意味着它不會*接受*更多。 – Pointy 2011-03-11 13:41:47
我發現第一個要求不對稱。在一個參數中捲曲一個函數應該返回一個沒有參數的函數,在我看來... – 6502 2011-03-11 13:53:02
我知道如果函數聲明一些參數它可以接受更多,但無論如何,可能會有一種情況,當我想檢查長度屬性和解決方案將打破這一邏輯。 1和2問題沒有答案,但核心問題解決了,所以我把問題標記爲已解決 – qnikst 2011-03-11 17:11:59