【发布时间】: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)重复f4 次,返回(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