Y組合子
關(guān)于 Y Combinator
的文章可謂數(shù)不勝數(shù),這個(gè)由師從希爾伯特的著名邏輯學(xué)家 Haskell B.Curry (Haskell語言就是以他命名的,而函數(shù)式編程語言里面的Curry手法也是以他命名)“發(fā)明”出來的組合算子(Haskell是研究 組合邏輯(combinatory logic)的)仿佛有種神奇的魔力,它能夠算出給定lambda表達(dá)式(函數(shù))的 不動(dòng)點(diǎn) 。從而使得遞歸成為可能。
這里需要告知一個(gè)概念 不動(dòng)點(diǎn)組合子
:
不動(dòng)點(diǎn)組合子(英語:Fixed-point combinator,或不動(dòng)點(diǎn)算子)是計(jì)算其他函數(shù)的一個(gè)不動(dòng)點(diǎn)的高階函數(shù)。
函數(shù)f的不動(dòng)點(diǎn)是一個(gè)值x使得 f(x) = x
。例如,0和1是函數(shù) f(x) = x^2 的不動(dòng)點(diǎn),因?yàn)?0^2 = 0而 1^2 = 1。鑒于一階函數(shù)(在簡(jiǎn)單值比如整數(shù)上的函數(shù))的不動(dòng)點(diǎn)是個(gè)一階值,高階函數(shù)f的不動(dòng)點(diǎn)是另一個(gè)函數(shù)g使得 f(g) = g
。那么,不動(dòng)點(diǎn)算子是任何函數(shù)fix使得對(duì)于任何函數(shù)f都有
f(fix(f)) = fix(f)
. 不動(dòng)點(diǎn)組合子允許定義匿名的遞歸函數(shù)。它們可以用非遞歸的lambda抽象來定義.
在無類型lambda演算中眾所周知的(可能是最簡(jiǎn)單的)不動(dòng)點(diǎn)組合子叫做Y組合子。
接下來,我們通過一定的演算推到下這個(gè)Y組合子。
// 首先我們定義這樣一個(gè)可以用作求階乘的遞歸函數(shù)const fact = (n) => n<=1?1:n*fact(n-1