我正在尝试使用javascript实现教堂数字(我对lambda演算和js中的函数编程是相当陌生的)
这是我定义C0的代码(C0 =λs.λz.z):
c0 = s => z => z
这是针对C1的(C1 =λs.λz.sz):
c1 = s => z => s(z)
这是用于后继函数(succ =λn.λs.λz.s(nsz)):
n => s => z => s(n(s)(z))
但是,将C0和C1都应用到此函数时,会发生相同的结果(并且两者都不正确):
succ(c1)
-> s => z => s(n(s)(z))
succ(c0)
-> s => z => s(n(s)(z))
我究竟做错了什么?
最佳答案
您的教堂数字由lambda编码。为了查看其效果,必须提供一个函数和一个输入。 inc
和0
在下面使用。否则,教堂数字是未评估的函数。在JavaScript中,当您console.log
一个函数时,将打印该函数的源代码。
const succ =
n => s => z => s(n(s)(z))
const inc = x =>
x + 1
const c0 =
s => z => z
const c1 =
succ (c0)
const c2 =
succ (c1)
console .log
( c0 (inc) (0) // 0
, c1 (inc) (0) // 1
, c2 (inc) (0) // 2
, succ (c2) (inc) (0) // 3
)
在
c2
上方是succ(succ(c0))
,它是教堂数字2。将我们的教堂数字应用于函数inc
和输入值0
,该函数称为两(2)次。 c2 (inc) (0)
产生与inc(inc(0))
相同的结果