我如何在LISP中使教堂数字更加人性化?
-
28-09-2019 - |
题
我可以使用方案来定义教会数字相当容易:
> (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
不隶属于 StackOverflow