提问人:Another Noone 提问时间:1/20/2020 最后编辑:soegaardAnother Noone 更新时间:10/19/2020 访问量:177
Racket BSL:如何将列表中具有一个共同属性的结构的两个实例组合在一起?
Racket BSL: How can I combine two instances of a structure in a list that have one common attribute?
问:
我有一个称为“联系人”的结构实例列表,它基本上是一个电话号码和与他们通话的持续时间。
我现在想将同一电话号码的所有条目与所有通话的总持续时间相加。
例如:我想转:
(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
答:
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 语言设置。
评论