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

Racket中'Application not a procedure'错误的排查与修复

解决Racket中"application: not a procedure"错误及修复dates_in_month函数

错误含义解释

你碰到的application: not a procedure; expected a procedure that can be applied to arguments given: 5错误,本质是把非函数类型的值当成函数来调用了。当你调用(dates_in_month test-dates 5)时,参数month被赋值为数字5,而代码里写了(month date),这相当于尝试执行(5 date)——数字5不是可调用的过程(函数),所以Racket抛出了这个错误。

代码中的问题

  1. 错误的月份提取逻辑:你误将传入的目标月份参数month当成了提取日期月份的函数,实际上要从日期向量(比如#(5 5 2000))里获取月份,应该用Racket的vector-ref函数,取向量的第2个元素(索引从0开始,对应索引1)。
  2. (冗余但不影响报错)你自己定义了append函数,但Racket标准库已经自带该函数,这个自定义代码可以删除以避免混淆。

修复后的代码

#lang racket

(define (dates_in_month dates target-month)
  (if (null? dates)
      '()
      (let ((date (car dates)))
        (if (= (vector-ref date 1) target-month)
            (cons date (dates_in_month (cdr dates) target-month))
            (dates_in_month (cdr dates) target-month)))))

(define test-dates '(#(1 1 2000) #(2 2 2000) #(3 3 2000) #(4 4 2000) #(5 5 2000) #(6 6 2000)))
(dates_in_month test-dates 5)

运行结果

执行后会返回'(#(5 5 2000)),符合预期——仅保留原列表中5月份的日期,且顺序与原列表一致。

更简洁的函数式写法

用Racket的高阶函数filter可以简化代码,更符合函数式编程风格:

#lang racket

(define (dates_in_month dates target-month)
  (filter (lambda (date) (= (vector-ref date 1) target-month)) dates))

(define test-dates '(#(1 1 2000) #(2 2 2000) #(3 3 2000) #(4 4 2000) #(5 5 2000) #(6 6 2000)))
(dates_in_month test-dates 5)

这个版本功能和之前完全一致,但代码更简洁。

内容的提问来源于stack exchange,提问作者Bingolina_Ava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:42:47