You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将生成列表的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:25:25