如何在lisp中使教堂数字更具人性化?

时间:2010-04-20 13:46:17

标签: lambda lambda-calculus church-encoding

我可以使用方案轻松定义教堂数字:

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

然而,这并不容易认识到(f f)为0且(f(f f))为1.有没有办法让这些数字更具可读性?理想的是:

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

示例是在计划中,但我会在任何口齿不清的情况下回答。

1 个答案:

答案 0 :(得分:9)

首先让我们定义具有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-to-int,它将教堂数字转换为int,然后可以正常显示:< / p>

> (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