我正在尝试用 javascript 实现教堂数字。(我对 js 中的 lambda 演算和函数式编程相当陌生)
这是我定义 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))
,它是 Church 数字 2。将我们的 Church 数字应用于函数 inc
,以及输入值 0
,该函数被调用两 (2) 次。 c2 (inc) (0)
产生与 inc(inc(0))
关于javascript - 实现教堂数字和后继函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53524989/