Type | Values |
---|---|
Integer | all integers, …, -2 1 0 1 2 3 |
Int | limited size integers, typically -263 … 263-1 |
Float Double | floating point numbers,
e.g. 0.25 -3.5 pi 1.5e6 |
Bool | False True |
[Int] [Bool] | lists, e.g. [] [1,2,5] [True] [[1,2],[3,4]] |
Char | characters, e.g. 'H' 'a' '5' '+' |
String | text, e.g. "Hello world" "Haskell" |
(Int,Bool) (String,Double) | pairs, e.g. (42,True) ("Prawns",245.00) |
fac :: Integer -> Integer fac n = product [1..n] inside :: Double -> Double -> Bool inside x y = x^2 + y^2 < 4
data Suit = Spades | Hearts | Diamonds | Clubs
Suit
Spades
<interactive>:3:1: error:
• No instance for (Show Suit) arising from a use of ‘print’
• ...
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 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
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]
Hand
[Card]
handBeats :: Hand -> Card -> Bool handBeats hand card = betterCards hand card /= [] betterCards :: Hand -> Card -> [Card] betterCards hand card = [ c | c<-hand, cardBeats c 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 sameSuit :: Hand -> Suit -> Hand
Suit
Rank
Card