首页 > 解决方案 > 为什么这个简单的方案代码会出错?

问题描述

(define ZERO (lambda (f x) x))    
(define ONE (lambda (f x) (f x)))
(define SUCC (lambda (n) (lambda (f x) (f (n f x)))))
(display (ZERO 1 0))
(display (ONE 1 0))
(display ((SUCC ZERO) 1 0))

ZERO 功能工作正常。当我运行这段代码时,我得到一个错误,

错误:无效的应用程序:(1 0)

对于ONE,SUCC函数。

如何修复我的代码以使其正常工作?

标签: scheme

解决方案


这是数字的 Church 编码;数字 K 由函数f对某个参数的 K 次应用来表示x
(令人惊讶的是,函数的恒等式和那个论点是无关紧要的——你可以在不关心的情况下构建所有的数学。)

你可以通过适当的选择来让它变得有点意义fx- 例如,尝试0

(define (inc x) (+ x 1))

所以数字 K 表示为 0 加 1,K 倍。

> (ZERO inc 0)
0
> (ONE inc 0)
1
> ((SUCC ONE) inc 0)
2

您还可以使用评估函数添加一些便利:

> (define (number n) (n inc 0))
> (number ZERO)
0
> (number ONE)
1
> (number (SUCC (SUCC (SUCC (SUCC ONE)))))
5

推荐阅读