【问题标题】:Return something enclosed in parentheses in Scheme返回 Scheme 中括号中的内容
【发布时间】:2020-03-09 14:22:30
【问题描述】:

我有以下关于 Church 数字的后继和前驱的代码: 考虑以下代码:

(define zero (lambda () '() ))   ; Initialize Church numeral zero as nil
(define (succ x) (lambda () x))  ; Wraps x with another function and returns it
(define (pred x) (x))            ; "Unwraps" one shell function of x and returns it

(define one (succ zero))         ; gives me the Church numeral one
(pred one)

假设我在 pred 函数中做了如下改动:

(define (pred x) x)

返回 x 和 (x) 有什么区别?返回 (x) 在语法和逻辑上究竟是什么意思?

【问题讨论】:

  • 在我看来,这些数字不像教堂数字......它们是 lambda 中数字的不同编码吗?这种不同的编码是如何工作的?我的意思是,你如何在程序中使用这些 lambda 编码的数字之一来计算一些东西?
  • 在此上下文中,x 是用于表示数字的lambda(x) 是该lambda应用程序 - 一个函数调用。
  • 它们是教堂数字,因为每个数字 n 都表示为 n 个函数的嵌套
  • 也许你误解了教堂数字。在面向对象的术语中,Church 数字由“repeat-N-times”方法表示。例如,如果 N 是教堂数字 4,则 (N f x) 重复 f 4 次,返回 (f (f (f (f x))))(N f x) 可以被认为是N.repeat-N-times(f, x)。您所拥有的似乎是将数字编码为 lambda 的不同编码,与 Church 数字不同。您的问题是关于 Church 数字的“重复 N 次”概念,还是与代码中显示的“nested-lambda-nil”编码有关?
  • 我猜是“nested-lambda-nil”

标签: scheme racket church-encoding


【解决方案1】:

功能

(define (pred x) x)

是恒等函数。该函数接受一个值并将其绑定到参数x。然后它评估主体x,返回原始值。

功能

(define (pred x) (x))

将一个值作为输入并将其绑定到参数x。 然后它评估身体(x)。表达式(x) 表示调用(希望是一个函数)x,不带参数。

(pred (lambda () 42)) will evaluate to 42.

因此,在您的编码上下文中,(lamdda () x) 包装了一个函数层一个值,(x) 删除了该函数层。

【讨论】:

    猜你喜欢
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2018-07-14
    • 1970-01-01
    相关资源
    最近更新 更多