Types 从定义的类型中筛选出字段值(长度未知的列表)

Types 从定义的类型中筛选出字段值(长度未知的列表),types,filter,racket,Types,Filter,Racket,我定义了这种类型的图像: (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"))

我定义了这种类型的图像:

(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)
我想计算列表中所有工资的总和

我的方法是筛选薪资字段,然后映射该字段。但我不知道如何筛选一个场地,我在谷歌上搜索了这么多,但似乎都找不到,在球拍指南中也找不到。 因此,用一段代码来回答这个问题是值得赞赏的,但更值得赞赏的是,我可以找到解决这个问题的方法。

可以用来过滤每种类型的工资

[type case]像cond一样进行调度,将case expr的结果按顺序与所有变量匹配。第一次成功匹配将触发对匹配的body expr的求值,其值是整个类型case表达式的结果

例如,以下工资函数从通用示例类型e中提取工资:

然后,总薪资成为每个列表元素薪资的递归总和:

(define (sum-salaries lst)
  (if (null? lst) 0 (+ (salary (car lst))
                       (sum-salaries (cdr lst)))))
使用上述示例,工资总额为:

(sum-salaries (list e1 e2 e3))
==> 5004

谢谢!您在哪里找到[type case]定义的?它位于上面提供的链接中。看见
(define (sum-salaries lst)
  (if (null? lst) 0 (+ (salary (car lst))
                       (sum-salaries (cdr lst)))))
(sum-salaries (list e1 e2 e3))
==> 5004