实现教会数字和继任者功能
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 编码的。为了查看它们的效果,您必须提供一个函数和一个输入。下面使用 inc
和 0
。否则,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
)
上方c2
是succ(succ(c0))
,这是教会数字2。将我们的教会数字应用于函数inc
和输入值0
,函数被调用两 (2) 次。 c2 (inc) (0)
产生与 inc(inc(0))
相同的结果
我正在尝试用 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 编码的。为了查看它们的效果,您必须提供一个函数和一个输入。下面使用 inc
和 0
。否则,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
)
上方c2
是succ(succ(c0))
,这是教会数字2。将我们的教会数字应用于函数inc
和输入值0
,函数被调用两 (2) 次。 c2 (inc) (0)
产生与 inc(inc(0))