“定义一个过程'reduce-per-key',其中一个过程reducef和一个关联列表,其中每个键与一个列表配对。输出是一个相同结构的列表,除了每个键现在与结果相关联将 reducef 应用于其关联列表"
我已经写了 'map-per-key' 和 'group-by-key' :
(define (map-per-key mapf lls)
(cond
[(null? lls) '()]
[else (append (mapf (car lls))(map-per-key mapf (cdr lls)))]))
(define (addval kv lls)
(cond
[(null? lls) (list (list (car kv)(cdr kv)))]
[(eq? (caar lls) (car kv))
(cons (list (car kv) (cons (cadr kv) (cadar lls)))(cdr lls))]
[else (cons (car lls)(addval kv (cdr lls)))]))
(define (group-by-key lls)
(cond
[(null? lls) '()]
[else (addval (car lls) (group-by-key (cdr lls)))]))
我将如何编写下一步“reduce-per-key”?我也很难确定它是否需要两个或三个参数。
到目前为止,我想出了:
(define (reduce-per-key reducef lls)
(let loop ((val (car lls))
(lls (cdr lls)))
(if (null? lls) val
(loop (reducef val (car lls)) (cdr lls)))))
但是,对于测试用例,例如:
(reduce-per-key
(lambda (kv) (list (car kv) (length (cadr kv))))
(group-by-key
(map-per-key (lambda (kv) (list kv kv kv)) xs)))
我收到不正确的参数计数,但是当我尝试使用三个参数编写它时,我也收到此错误。有人知道我在做什么错吗?