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

Racket BSL: How can I combine two instances of a structure in a list that have one common attribute?

提问人:Another Noone 提问时间:1/20/2020 最后编辑:soegaardAnother Noone 更新时间:10/19/2020 访问量:177

问:

我有一个称为“联系人”的结构实例列表,它基本上是一个电话号码和与他们通话的持续时间。

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

例如:我想转:

(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))

到:

(list
   (make-contact "0111222222" 8)
   (make-contact "0111333333" 5)
   (make-contact "0111444444" 3)
   (make-contact "0111555555" 10))

我使用带有列表缩写的 Racket BSL

拍-学生语言 HTDP

评论


答:

0赞 vonschlager 1/20/2020 #1

这适用于 htdp/bsl(我很好奇是否有更干净的解决方案):

#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))

评论

0赞 Alex Knauth 1/20/2020
我也不认为 BSL 中存在,它只在 ISL 中引入foldl
0赞 vonschlager 1/20/2020
好的,今天会检查它的信,顺便说一句,我发现 lang 应该是“htdp/bsl”,是的,它不支持折叠和哈希:(
0赞 vonschlager 1/21/2020
我更新了解决方案,它适用于 htdp/bsl 语言设置。