(define $Suit (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (deconstructor {[spade [] {[ {[]}] [_ {}]}] [heart [] {[ {[]}] [_ {}]}] [club [] {[ {[]}] [_ {}]}] [diamond [] {[ {[]}] [_ {}]}] })] [$equal? (lambda [$val $tgt] (match [val tgt] [Suit Suit] {[[ ] ] [[ ] ] [[ ] ] [[ ] ] [[_ _] ]}))] })) (define $Mod (lambda [$m] (type {[$var-match (lambda [$tgt] {(mod tgt m)})] [$equal? (lambda [$val $tgt] (= (mod val m) (mod tgt m)))]}))) (define $Card (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (deconstructor {[card [Suit (Mod 13)] {[ {[s n]}]}]})] [$equal? (lambda [$val $tgt] (match [val tgt] [Card Card] {[[ ] ] [[_ _] ]}))]})) (define $poker-hands (lambda [$Cs] (match Cs (Multiset Card) {[ ! >>>>> ] [ ! ! ! >>>>> ] [ ! ! ! >>>>> ] [ ! ! ! ! ! >>>>> ] [ ! >>>>> ] [ >>>>> ] [ ! ! >>>>> ] [ >>>>> ] [ >>>>> ]})))