我将 lambda 演算与 javascript 一起使用。我将尝试展示一些小例子,以及Bluebird/ComposeSUCC
函数是如何工作的,并且可以组合使用。B
首先提醒一下Church-Numerals(在 JS 中):
const n0 = f => x => x
const n1 = f => x => f(x)
const n2 = f => x => f(f(x))
const n3 = f => x => f(f(f(x)))
以及 SUCC := λnfx.f(nfx)
JS 中教堂数字的继任者:
const succ = n => f => x => f( n(f)(x) )
. 我们可以看到succ
-Function 只需要一个 Church-Numeral 并在f
前面添加一个,因此succ(n1)
带有主体的 af(x)
将是f(f(x))
。因此,它最终f
总共做了 1 + n 个组合。
// example creating new Church-Numbers with the Succesor-Function
const n4 = succ(n3)
const n5 = succ(n4)
// or do Addition with Church-Numbers
const n7 = n2(succ)(n5)
const n10 = n5(succ)(n5)
//to test if it works, us the helper-function churchtoJsNum
const churchtoJsNum = n => n(x => x + 1)(0)
churchtoJsNum(n10) // 10
还有另一种写后继的方法,因为我们正在做 n-fold 组合:组合函数。B
Smullyan 在 Curry 的组合器之后将其命名为 Bluebird 。
B := λfgx.f(gx)
在 JS 中:const B = f => g => x => f(g(x))
现在可以结合succ
和B
-Function。
const succ = n => f => x => B(f) (n(f)) (x)
现在我们有了一个实际的组合函数,我们可以在不提及最终 x 值参数的情况下定义后继。
const succ = n => f => B(f)(n(f));