我定义了这种类型的图像:
(define-type Example
[E1(salary number?)]
[E2(salary number?) (age number?)]
[E3(salary number?) (name string?)]
[E4(random number?)])
现在我得到一个包含某些示例类型的列表,比如
(define e1(E1 4))
(define e2(E2 3000 25))
(define e3(E3 2000 "anton"))
(list e1 e2 e3)
我想计算该列表中所有工资的总和。
我的方法是为薪水字段过滤,然后映射。但我不知道如何过滤一个字段,我用Google搜索了这么多,但我似乎无法找到它,也不是在球拍指南中。 所以用代码片段来回答这个问题是值得赞赏的,但更值得欣赏的是我实际上可以找到解决这个问题的方法。
答案 0 :(得分:1)
type-case
可用于过滤每个类型的薪水。
(type-case type case-expr (variant (field ...) body-expr) ...)
[type-case]会调度 cond ,将 case-expr 的结果依次与所有变种相匹配。第一次成功匹配会触发匹配 body-expr 的评估,其值是整个 type-case 表达式的结果。
例如,以下salary
函数从常规Example
类型e
中提取薪水:
(define (salary e)
(type-case Example e
[E1 (salary) (E1-salary e)]
[E2 (salary age) (E2-salary e)]
[E3 (salary name) (E3-salary e)]
[E4 (random) 0]))
然后,总薪水成为每个列表元素薪水的递归总和:
(define (sum-salaries lst)
(if (null? lst) 0 (+ (salary (car lst))
(sum-salaries (cdr lst)))))
使用相关示例,工资总和变为:
(sum-salaries (list e1 e2 e3))
==> 5004