实现教堂数字和后继功能

时间:2018-11-28 17:26:02

标签: javascript functional-programming lambda-calculus

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

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

您的教堂数字由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))