不知道如何解决此错误[球拍]:"car: contract violation expected: pair? given: '()"



我正试图获得一个包含以下n个元素的平均值的列表。我正在阅读一个有7列的csv文件,我只是使用了第六个有数值的csv来获得平均值。这是代码

;Function that returns a list containing the values of the desired column
(define (get-column col)
(let loop
([file (cdr(all-rows csv-path read-csv))]
[result empty])
(if (empty? file)
result
(loop (cdr file)
(cond
[(equal? col 1) (append result (list (caar file)))]
[(equal? col 2) (append result (list (string->number(cadar file))))]
[(equal? col 3) (append result (list (string->number(caddar file))))]
[(equal? col 4) (append result (list (string->number(car (cdddar file)))))]
[(equal? col 5) (append result (list (string->number(cadr (cdddar file)))))]
[(equal? col 6) (append result (list (string->number(caddr (cdddar file)))))]
[(equal? col 7) (append result (list (string->number(car (cdddr (cdddar file))))))]
)))))
(define (suma-SMA col n)
(let loop
([n n]
[res 0]
[col col])
(if (zero? n)
res
(loop (sub1 n) (+ res (car col)) (cdr col)))))
(define (get-SMA days)
(let loop
([col (get-column 6)]
[result empty])
(if (empty? col)
result
(loop (cdr col)(append result (list (suma-SMA col days)))))))

这里有一个函数,它执行您在注释中要求的操作,例如,给定(1 2 3 4),它会生成((1+2)/2 (2+3)/2 (3+4)/2)

(define (sum list)
(cond
((null? list)
'()) ;; error?
((null? (cdr list))
'())
(else
(cons (/ (+ (car list) (cadr list)) 2) (sum (cdr list))))))

我仍然有点困惑,因为即使是get-SMAsuma-SMA的组合也不会像这样。完全不清楚days变量在做什么,正如您所看到的,我在上面的代码中并不需要它。

所以我可能误解了你想要做的事情,但上面的函数确实满足了你的要求,所以希望它会有所帮助。

以下是我发现对我的问题有用的答案。

(define (sum list n)
(cond
((null? list)
'()) ;; error?
((null? (cdr list))
'())
(else
(cons  (suma-SMA list n) (sum (cdr list) n)))))

最新更新