data Suit = Spades | Hearts | Diamonds | Clubs
Suit
Spades
<interactive>:3:1: error:
• No instance for (Show Suit) arising from a use of ‘print’
• In a stmt of an interactive GHCi command: print it
:i print
print :: Show a => a -> IO () -- Defined in ‘System.IO’
data Suit = Spades | Hearts | Diamonds | Clubs deriving Show
data Colour = Black | Red deriving Show
colour :: Suit -> Colour colour Spades = Black colour Hearts = Red colour Diamonds = Red colour Clubs = Black
colour :: Suit -> Colour colour Spades = Black colour Clubs = Black colour s = Red
colour :: Suit -> Colour colour Spades = Black colour Clubs = Black colour _ = Red
colour :: Suit -> Colour colour suit = case suit of Spades -> Black Hearts -> Red Diamonds -> Red Clubs -> Black
f suit = case colour suit of Red -> (...) Black -> (...)
colour :: Suit -> Colour colour Spades = Black colour Clubs = Black coluor _ = Red
colour
colour Diamonds
*** Exception: DataTypes.hs:(19,1)-(20,23):
Non-exhaustive patterns in function colour
:set -Wincomplete-patterns
:load DataTypes.hs
DataTypes.hs:19:1: warning: [-Wincomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for ‘colour’:
Patterns not matched:
Hearts
Diamonds
-Wmissing-signatures
data Rank = Numeric Int | Jack | Queen | King | Ace deriving Show
:t Numeric
Numeric :: Int -> Rank
Numeric 3
Numeric 3
rankBeats :: Rank -> Rank -> Bool
Rank
Rank
rankBeats :: Rank -> Rank -> Bool
rankBeats _ Ace = False -- nothing beats an Ace
rankBeats :: Rank -> Rank -> Bool rankBeats _ Ace = False -- nothing beats an Ace rankBeats Ace _ = True -- an Ace beats anything else
rankBeats :: Rank -> Rank -> Bool rankBeats _ Ace = False -- nothing beats an Ace rankBeats Ace _ = True -- an Ace beats everything else rankBeats _ King = False rankBeats King _ = True rankBeats _ Queen = False rankBeats Queen _ = True rankBeats _ Jack = False rankBeats Jack _ = True
rankBeats :: Rank -> Rank -> Bool rankBeats _ Ace = False -- nothing beats an Ace rankBeats Ace _ = True -- an Ace beats everything else rankBeats _ King = False rankBeats King _ = True rankBeats _ Queen = False rankBeats Queen _ = True rankBeats _ Jack = False rankBeats Jack _ = True rankBeats (Numeric m) (Numeric n) = m > n
rankBeats Jack (Numeric 7)
True
rankBeats (Numeric 10) Queen
False
data Rank = Numeric Int | Jack | Queen | King | Ace deriving (Eq,Ord,Show) rankBeats :: Rank -> Rank -> Bool rankBeats r1 r2 = r1>r2
deriving Ord
.
Numeric n
n
[2..10]
Numeric 0
Numeric 35
data Rank = N2 | N3 | N4 | N5 | N6 | N7 | N8 | N9 | N10 | Jack | Queen | King | Ace deriving (Eq,Ord,Show,Enum)
fromEnum N2
0
[N9 .. Ace]
[N9,N10,Jack,Queen,King,Ace]
data Card = Card Rank Suit deriving Show
rank :: Card -> Rank rank (Card r s) = r suit :: Card -> Suit suit (Card r s) = s
data Card = Card {rank::Rank, suit:: Suit} deriving Show example_card_1 = Card Ace Spades example_card_2 = Card {rank=King, suit=Hearts}
rank
and
suit
at the same time.
cardBeats :: Card -> Card -> Bool cardBeats (Card r1 s1) (Card r2 s2) = s1==s2 && rankBeats r1 r2
Suit
type
data Suit = Spades | Hearts | Diamonds | Clubs deriving (Eq,Show)
cardBeats :: Card -> Card -> Bool cardBeats (Card r1 s1) (Card r2 s2) = s1==s2 && rankBeats r1 r2
cardBeats :: Card -> Card -> Bool cardBeats card1 card2 = suit card1 == suit card2 && rankBeats (rank card1) (rank card2)
type Hand = [Card]
data Hand = Empty | Add Card Hand deriving Show
handBeats :: Hand -> Card -> Bool handBeats Empty card = False handBeats (Add c h) card = cardBeats c card || handBeats h card
chooseCard :: Card -> Hand -> Card
chooseCard :: Card -> Hand -> Card chooseCard beat hand | handBeats hand beat = lowestCard (betterCards hand beat) | haveSuit hand (suit beat) = lowestCard (sameSuit hand (suit beat)) | otherwise = lowestCard hand
haveSuit :: Hand -> Suit -> Bool lowestCard :: Hand -> Card betterCards :: Hand -> Card -> Hand sameSuit :: Hand -> Suit -> Hand