从defiined类型中筛选出一个字段值(长度未知的列表)

时间:2017-09-02 13:05:48

标签: 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"))
(list e1 e2 e3)

我想计算该列表中所有工资的总和。

我的方法是为薪水字段过滤,然后映射。但我不知道如何过滤一个字段,我用Google搜索了这么多,但我似乎无法找到它,也不是在球拍指南中。 所以用代码片段来回答这个问题是值得赞赏的,但更值得欣赏的是我实际上可以找到解决这个问题的方法。

1 个答案:

答案 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