我今天开始学习球拍,所以请耐心等待:)
我尝试的是对结构中存储的数字(在这种情况下为年龄)求和。 所以我有这个:
(define-struct rec (name age)) ; defining the struct of records
(define r1 (make-rec "Joe" 23))
(define r2 (make-rec "Sue" 13))
(define r3 (make-rec "Ann" 44))
(define reclist (list r1 r2 r3)) ; defining a list of records
我发现了如何对整数求和,这似乎是一个很好的方法:
(define liste (list 1 2 3 4 5))
(define (sum-list l)
(cond
[(empty? l) 0]
[(+ (first l) (sum-list (rest l)))]))
现在,我一直在尝试以某种方式组合这些功能,我可以抓住每个记录中的年龄,然后将它们总结,但无济于事。我尝试了不同的循环结构,但问题是它永远不会返回值而是返回过程名称。
我知道,我在这里遗漏了一些非常基本的东西,但我还是被卡住了。
答案 0 :(得分:3)
由于您的sum-list
功能仅对数字起作用,因此您需要将rec
列表投影到数字列表中。这可以使用map
函数完成。表达式(map rec-age reclist)
将为您生成数字列表。
答案 1 :(得分:0)
更改代码:
(define (sum-list lst . lkey)
(define key (if (null? lkey) values (car lkey)))
(cond
[(empty? lst) 0]
[(+ (key (first lst)) (sum-list (rest lst) key))]))
备用尾递归版
(define (sum-list lst . lkey)
(define key (if (null? lkey) car (compose (car lkey) car)))
(let loop ((acc 0) (lst lst))
(if (null? lst)
acc
(loop (+ acc (key lst))
(cdr lst)))))
在一个blob中替换更高阶的过程版本:
(define (sum-list lst . lkey)
(define key (if (null? lkey) values (car lkey)))
(foldl (lambda (x acc)
(+ acc (key x)))
0
lst))
使用map
获取值并应用:
(define (sum-list lst . lkey)
(apply +
(if (null? lkey)
lst
(map (car lkey) lst))))
对于许多元素,这可能更有效:
(define (sum-list lst . lkey)
(foldl +
0
(if (null? lkey)
lst
(map (car lkey) lst))))
所有工作都是这样的:
(sum-list '(1 2 3 4)) ; ==> 10
(sum-list '((1)(2)(3)(4)) car) ; ==> 10
(sum-list reclist rec-age) ; ==> 80