【发布时间】:2018-11-28 17:26:02
【问题描述】:
我正在尝试用 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))
我做错了什么?
【问题讨论】:
-
我注意到的第一件事是
nsz应该转换为n(s)(z)而不是n(s(z))。 -
当您执行
succ(c0)时,您会得到与succ(c1)相同的结果,因为它为您提供了仍然需要两个参数的lambda 函数的字符串表示形式。 -
@MarceloCamargo 所以除了将 n(s(z)) 更改为 n(s)(z) 结果是否正确?不应该是 s => z => s(z) 对于 C0 和 s => z => s(s(z)) 对于 C1 吗?
-
@Arya 不,
C0调用s零次,C1调用s一次。
标签: javascript functional-programming lambda-calculus