代码之家  ›  专栏  ›  技术社区  ›  Jason Baker

我怎样才能使教堂数字在Lisp中更容易被人阅读?

  •  2
  • Jason Baker  · 技术社区  · 14 年前

    我可以很容易地定义教堂数字使用方案:

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

    这个例子在Scheme中,但是我将在任何Lisp中得到一个答案。

    1 回复  |  直到 14 年前
        1
  •  9
  •   sepp2k    14 年前

    首先,让我们定义真正的教堂数字,它们具有理想的属性 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,然后可以正常显示:

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