我可以使用方案来定义教会数字相当容易:

> (define f (lambda (x) x))
> (f f) ;0
#<procedure:f>
> (f (f f)) ;1
#<procedure:f>

但是,这并不容易意识到 (f f) 0和(f(ff))是1。有没有办法使这些数字更可读?理想的是:

> (f f)
0
> (f (f f))
1

该示例是在方案中,但我将在任何LISP中回答。

有帮助吗?

解决方案

首先,让我们定义具有理想财产的真实教会数字 0 != 1:

(define zero (lambda (f x) x))
(define (succ cn) (lambda (f x) (f (cn f x))))

所以 zero 是教会的代表0, (succ zero) 1, (succ (succ zero)) 2等。

现在,由于这些只是函数,因此无法告诉REPL显示为数字,但是您可以定义一个函数CN到INT,该功能将教堂数字转换为ints,然后可以正常显示:

> (define (cn-to-int cn) (cn (lambda (x) (+ x 1)) 0))
> (cn-to-int zero)
0
> (cn-to-int (succ zero))
1
> (cn-to-int (succ (succ zero)))
2
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top