【问题标题】:implementing church numerals and successor function实现教堂数字和后继功能
【发布时间】: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


【解决方案1】:

您的教堂数字由 lambda 编码。为了看到它们的效果,你必须提供一个函数和一个输入。 inc0 在下面使用。否则,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)),即 Church 数字 2。将我们的 Church 数字应用于函数 inc 和输入值 0,该函数被调用两 (2) 次。 c2 (inc) (0) 产生与 inc(inc(0)) 相同的结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2011-03-05
    • 2017-02-10
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多