如何将生成列表的lambda传递给期望列表的Scheme过程?
实现函数应用到列表后移除首元素的过程
原代码与错误
原定义的过程:
(define (remove-first f) (rest f)) (define (sty f) (remove-first (lambda (x) (map f x)))) (define (square x) (* x x)) (define new-func (sty square)) (new-func (list 1 2 3))
运行时出现错误:
rest: expects a non-empty list; given: (lambda (a1) ...)
需求:创建名为sty的函数,接收一个函数,将其应用到列表后移除该列表的第一个元素。
问题分析与解决方案
错误核心是remove-first被传入了lambda函数而非列表,rest只能操作列表,自然报错。正确逻辑是让sty返回一个新函数,这个函数在接收到列表参数后,先完成映射操作得到列表,再移除首元素。
修正后的代码方案1(保留remove-first)
; 修正remove-first:接收列表,返回去掉首元素的列表 (define (remove-first lst) (rest lst)) ; sty返回一个处理列表的函数 (define (sty f) (lambda (x) (remove-first (map f x)))) ; 测试 (define (square x) (* x x)) (define new-func (sty square)) (new-func (list 1 2 3)) ; 输出 (4 9)
修正后的代码方案2(合并逻辑)
如果不需要单独的remove-first,可以直接简化:
(define (sty f) (lambda (x) (rest (map f x)))) ; 测试 (define (square x) (* x x)) (define new-func (sty square)) (new-func (list 1 2 3)) ; 输出 (4 9)
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

