「プロシージャreducefと、各キーがリストとペアになっている関連付けのリストであるプロシージャ「reduce-per-key」を定義します。出力は、各キーが結果に関連付けられていることを除いて、同じ構造のリストです関連付けられたリストに 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' をどのように記述すればよいでしょうか? また、引数が 2 つ必要なのか 3 つ必要なのかを判断するのにも苦労しています。
これまでのところ、私は思いついた:
(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)))
引数の数が正しくありませんが、引数を 3 つ指定して記述しようとすると、このエラーが発生します。私が間違っていることを知っている人はいますか?