javascript - 实现教堂数字和后继函数

标签 javascript functional-programming lambda-calculus

我正在尝试用 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 编码。为了看到它们的效果,您必须提供一个函数和一个输入。下面使用 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
  )

上面的 c2succ(succ(c0)),它是 Church 数字 2。将我们的 Church 数字应用于函数 inc ,以及输入值 0,该函数被调用两 (2) 次。 c2 (inc) (0) 产生与 inc(inc(0))

相同的结果

关于javascript - 实现教堂数字和后继函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53524989/

相关文章:

javascript - PivotTable.js OLAP 不考虑具有多个值的字段

function - 调用 Agda 中的函数

scala - 像普通的 Seq 一样对待 Spark RDD

haskell - 您如何从 lambda 术语转换为交互网络?

c++ - 使用 Boost.Bind 表达教会数字

javascript - Jquery ajax syntaxerror json.parse json 数据第 1 行第 1 列的意外字符

javascript - Angular 访问子组件内的方法() v1.5

javascript - AngularJS 没有正确解析大括号

javascript - React - useState 和 Firebase 的问题

haskell - Hindley-Milner 的哪一部分是你不明白的?