Jas*_*ker 2 lambda lambda-calculus church-encoding
我可以使用方案相当容易地定义教堂数字:
> (define f (lambda (x) x))
> (f f) ;0
#<procedure:f>
> (f (f f)) ;1
#<procedure:f>
Run Code Online (Sandbox Code Playgroud)
但是,这并不容易认识到(f f)0和(f(ff))是1.有没有办法让这些数字更具可读性?这将是理想的:
> (f f)
0
> (f (f f))
1
Run Code Online (Sandbox Code Playgroud)
示例是在计划中,但我会在任何口齿不清的情况下回答.
首先让我们定义真正的教堂数字,它们具有以下所需的特性0 != 1:
(define zero (lambda (f x) x))
(define (succ cn) (lambda (f x) (f (cn f x))))
Run Code Online (Sandbox Code Playgroud)
所以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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1173 次 |
| 最近记录: |