我正在尝试使用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))
我在做什么错了?
答案 0 :(得分:1)
您的教堂数字由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))