我正在尝试使用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编码。为了查看其效果,必须提供一个函数和一个输入。 inc0在下面使用。否则,教堂数字是未评估的函数。在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))相同的结果

10-08 12:35