这段简单Scheme代码报错是什么原因?该如何修复?
报错原因
你使用的是邱奇编码定义的自然数,这类定义的数值本质是高阶函数,调用规则为:第一个入参f必须是单参数可调用函数,第二个入参x是计算初始值。
你调用时给第一个参数传了数值1,不符合规则:
- ZERO的实现逻辑是直接返回第二个参数
x,全程没有用到f,所以即使传错参数也能正常返回结果,不会触发报错 - ONE的实现逻辑是将
f调用1次,传入的f是数值1,执行(f x)就变成了非法的(1 0)调用,数值无法作为函数执行,因此抛出对应错误 - SUCC生成的新邱奇数同样会调用
f参数,所以也会触发同类报错
修复方法
你可以先定义一个符合要求的单参数函数作为邱奇数的第一个入参,比如用于数值计算的自增函数,修改后可运行的代码如下:
(define ZERO (lambda (f x) x)) (define ONE (lambda (f x) (f x))) (define SUCC (lambda (n) (lambda (f x) (f (n f x))))) ; 定义单参数自增函数,作为邱奇数的调用参数 (define (add1 v) (+ v 1)) (display (ZERO add1 0)) (display (ONE add1 0)) (display ((SUCC ZERO) add1 0))
运行上述代码会依次输出0、1、1,符合预期逻辑。
内容的提问来源于stack exchange,提问作者minyak
相关产品推荐
相关产品推荐

