我在 javascript 中使用 lambda 演算。我将尝试展示一些小例子,SUCC 和函数 B aka Bluebird/Compose 是如何工作的并且可以组合使用。
首先用 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)))
以及 JS 中教会数字的继承者 SUCC := λnfx.f(nfx):
const succ = n => f => x => f( n(f)(x) )。
我们可以看到succ-Function 只接受一个教会数字并在前面添加一个f,因此带有主体f(x) 的succ(n1) 将是f(f(x))。因此,它最终总共做了 1 + n 个f 的合成。
// 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 组合:一个 compose 函数。 Smullyan 以 Curry 的 B 组合器将其命名为 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));