实现教会数字和继任者功能

implementing church numerals and successor function

我正在尝试用 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))

我做错了什么?

你的教会数字是用 lambdas 编码的。为了查看它们的效果,您必须提供一个函数和一个输入。下面使用 inc0。否则,Church 数字是一个未评估的函数。在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
  )

上方c2succ(succ(c0)),这是教会数字2。将我们的教会数字应用于函数inc和输入值0,函数被调用两 (2) 次。 c2 (inc) (0) 产生与 inc(inc(0))

相同的结果