2017-09-02 9 views
0

画像:フィルタアウトフィールド値を(未知の長さを持つリスト)

(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) 
のように、特定の例 - 種類のリストを取得します

とそのリストにあるすべての給与の合計を計算したいと思います。

私のアプローチは、給与フィールドのフィルタになり、それをマップします。しかし、私はどのようにフィールドをフィルタリングするのか分かりません、私はそんなに探検しましたが、私はそれを見つけることができない、ラケットガイドのいずれかではありません。 コードスニペットでこれに答えることは感謝しますが、実際にこの問題を解決する方法を実際に見つけることができます。

答えて

1

type-caseは、それぞれタイプの給与をフィルタリングするために使用できます。

(type-case type case-expr (variant (field ...) body-expr) ...) 

[型ケースは、全てに対して順次変種場合-exprの結果と一致する、CONDようにディスパッチします。最初に成功した一致は、一致するbody-exprの評価をトリガーします。この値は、タイプのケース式全体の結果になります。例えば

、以下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 
+0

ありがとうございました! [型格]定義はどこで見つかりましたか? – InDaPond

+0

これは上記のリンクにあります。 [type-case](https://docs.racket-lang.org/teachpack/2htdpabstraction.html?q=define-type#%28form._x._%28%28lib._teachpack%2F2htdp%2Fabstraction..rkt)を参照してください。 %29._type-case%29%29)。 – assefamaru

関連する問題