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抛出了这个错误。
代码中的问题
- 错误的月份提取逻辑:你误将传入的目标月份参数
month当成了提取日期月份的函数,实际上要从日期向量(比如#(5 5 2000))里获取月份,应该用Racket的vector-ref函数,取向量的第2个元素(索引从0开始,对应索引1)。 - (冗余但不影响报错)你自己定义了
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
相关产品推荐
相关产品推荐

