data Suit = Clubs | Spades | Hearts | Diamonds eq (Clubs, Clubs) = True eq (Spades, Spades) = True eq (Hearts, Hearts) = True eq (Diamonds, Diamonds) = True eq _ = False toString (Clubs) = "Clubs" toString (Spades) = "Spades" toString (Hearts) = "Hearts" toString (Diamonds) = "Diamonds" dominates (Spades, Hearts) = True dominates (Spades, Diamonds) = True dominates (Spades, Clubs) = True dominates (Hearts, Diamonds) = True dominates (Hearts, Clubs) = True dominates (Diamonds, Clubs) = True dominates (_, _) = False type Rank = Int outranks :: (Rank, Rank) -> Bool outranks (r1, r2) = (r1 > r2) rankToString (11) = "Jack" rankToString (12) = "Queen" rankToString (13) = "King" rankToString (14) = "Ace" rankToString (10) = "10" rankToString (9) = "9" rankToString (8) = "8" rankToString (7) = "7" rankToString (6) = "6" rankToString (5) = "5" rankToString (4) = "4" rankToString (3) = "3" rankToString (2) = "2" rankToString (1) = "1" data Card = Card (Suit, Rank) beats (Card(s1,r1), Card(s2,r2)) = dominates (s1, s2) || (eq (s1, s2) && outranks (r1, r2)) suitOf (Card(s,r)) = s data Hand = Empty | Fan (Card , Hand) collectSuit (s, Empty) = Empty collectSuit (s, Fan(Card(s', r), h)) = if eq (s, s') then Fan (Card(s', r), collectSuit (s, h)) else collectSuit (s, h) hand1 = Fan(Card(Spades,14), Fan(Card(Diamonds,10), Fan(Card(Clubs,7), Fan(Card(Spades,12), Fan(Card(Clubs,8), Empty))))) spades1 = collectSuit (Spades, hand1) points Empty = 0 points (Fan(Card(s, r), h)) = if (r>10) then (r-10+points h) else points(h) x = points hand1