Racket BSL:如何在一个列表中组合具有一个公共属性的两个结构实例?

Racket BSL:如何在一个列表中组合具有一个公共属性的两个结构实例?,racket,racket-student-languages,htdp,Racket,Racket Student Languages,Htdp,我有一个名为“contact”的结构实例列表,它基本上是一个电话号码以及与他们通话的持续时间 现在,我想将同一电话号码的所有条目与所有通话的总持续时间相加 例如:我想转: (list (make-contact "0111222222" 2) (make-contact "0111222222" 6) (make-contact "0111333333" 5) (make-contact "0111444444" 3) (make-contact "01115555

我有一个名为“contact”的结构实例列表,它基本上是一个电话号码以及与他们通话的持续时间

现在,我想将同一电话号码的所有条目与所有通话的总持续时间相加

例如:我想转:

(list
   (make-contact "0111222222" 2)
   (make-contact "0111222222" 6)
   (make-contact "0111333333" 5)
   (make-contact "0111444444" 3)
   (make-contact "0111555555" 8)
   (make-contact "0111555555" 2))
进入:

我使用带有列表缩写的Racket BSL这适用于htdp/BSL(我很好奇是否有更干净的解决方案):


我认为BSL中也不存在
foldl
,它只是在ISLok中引入的,今天我会检查它,顺便说一句,我发现lang应该是“htdp/BSL”,是的,它不支持折叠和散列:(我更新了解决方案,它与htdp/BSL语言设置一起工作。
(list
   (make-contact "0111222222" 8)
   (make-contact "0111333333" 5)
   (make-contact "0111444444" 3)
   (make-contact "0111555555" 10))
#lang htdp/bsl

(define-struct contact (number time))

(define contacts (list
   (make-contact "0111222222" 2)
   (make-contact "0111222222" 6)
   (make-contact "0111333333" 5)
   (make-contact "0111444444" 3)
   (make-contact "0111555555" 8)
   (make-contact "0111555555" 2)))

(define (sum-contacts acc s)
    (cond [(empty? s) acc]
          [(and (not (empty? acc))
                (equal? (contact-number (first s))
                        (contact-number (first acc))))
            (sum-contacts (cons
                            (make-contact
                               (contact-number (first s))
                               (+ (contact-time (first s))
                                  (contact-time (first acc)))) (rest acc))
                (rest s))]
          [else (sum-contacts (cons (first s) acc) (rest s))]))

(reverse (sum-contacts '() contacts))