2012-09-13 50 views
3

sry關於愚蠢的方式我在這裏解釋了這個問題的一些解釋:我正在用javascript進行lambda微積分實驗,並且遇到一些小問題。 (你不必知道拉姆達演算任何事情來幫助我)功能返回值,而不用用給定參數替換變量

我有這個功能(教會數字1 BTW):

function num1(c) { 
return function(x){ 
    return c(x); 
} 
} 

alert(num1) 

行爲與預期,並給出確切的同樣的事情,以上。

alert(num1(num1)) 

行爲不意外,並給出:

function (x) { 
    return c(x); 
} 

爲什麼不JavaScript和功能NUM1替換 'C'?但

alert(num1(num1)(num1)) 

給出:

function (x) { 
    return c(x); 
} 

,並表明了第一個C是在事實上取代了功能它應該。 如果「C」就不會被替換,那麼這一切都不會發生:

(num1(num1)(num1))= 

(function (x) {return c(x);}(num1= 

c(function num1(c) { 
    return function(x){ 
     return c(x); 
    } 
}) 

所以,這一切的一切,代碼是做什麼它應該,但它不輸出功能與'c'被替換。我能做什麼?後來,我會更多的功能,然後我不能告訴num1(asd)num1(jkl)分開,因爲'c'不會被取代。

非常感謝您的幫助!

Someonelse

+0

貌似你試圖抓住'Y型combinatorial' ... – SexyBeast

+0

我知道Y-combinator以及它如何工作(但不是爲什麼;)),我可以在紙上使用它。我還不知道我最終想用JS來做什麼,但這個例子只是簡化了我的實際問題:S-和K-Combinator克服了同樣的愚蠢行爲。 – someonelse

+0

[FAQ](http://stackoverflow.com/faq)會告訴你如何在你的問題中格式化代碼。 – Pointy

回答

1

你爲什麼不試試這個:

function num1(c) { 
    function rv(x){ 
    return c(x); 
    } 
    rv.showBinding = function() { 
    return c; 
    } 

    return rv; 

} 

然後:

alert(num1); 
alert(num1(num1).showBinding());