modelling datatypes

Modelling & Datatypes Koen Lindstrm Claessen Software Software - PowerPoint PPT Presentation

Modelling & Datatypes Koen Lindstrm Claessen Software Software = Programs + Data Modelling Data A big part of designing software is modelling the data in an appropriate way Numbers are not good for this! We model the data by


  1. Modelling & Datatypes Koen Lindström Claessen

  2. Software Software = Programs + Data

  3. Modelling Data • A big part of designing software is modelling the data in an appropriate way • Numbers are not good for this! • We model the data by defining new types

  4. Modelling a Card Game Hearts, Whist, Plump, • Every card has a suit Bridge, ... • Model by a new type: data Suit = Spades | Hearts | Diamonds | Clubs The values The new of this type type

  5. Investigating the new type Main> :i Suit The new type -- type constructor data Suit -- constructors: The new values Spades :: Suit -- constructors Hearts :: Suit Diamonds :: Suit Types and Clubs :: Suit constructors start with a Main> :i Spades capital letter Spades :: Suit -- data constructor

  6. Printing Values Main> Spades ERROR - Cannot find "show" function for: *** Expression : Spades Needed to print *** Of type : Suit values Main> :i show show :: Show a => a -> String -- class member • Fix data Suit = Spades | Hearts | Diamonds | Clubs deriving Show Main> Spades Spades

  7. The Colours of Cards • Each suit has a colour – red or black • Model colours by a type data Colour = Black | Red deriving Show • Define functions by pattern matching Main> colour Hearts colour :: Suit -> Colour Red colour Spades = Black colour Hearts = Red colour Diamonds = Red colour Clubs = Black One equation per value

  8. The Colours of Cards colour :: Suit -> Colour colour :: Suit -> Colour colour Spades = Black colour Spades = Black colour Hearts = Red colour Clubs = Black colour Diamonds = Red colour _ = Red colour Clubs = Black Matches anything

  9. The Ranks of Cards • Cards have ranks: 2..10, J, Q, K, A Numeric ranks • Model by a new type data Rank = Numeric Integer | Jack | Queen | King | Ace deriving Show Numeric ranks contain an Integer Main> :i Numeric Numeric :: Integer -> Rank -- data constructor Main> Numeric 3 Numeric 3

  10. Rank Beats Rank • When does one rank beat another? A K Q J m>n m n J Q K A

  11. Rank Beats Rank rankBeats :: Rank -> Rank -> Bool

  12. Rank Beats Rank • When does one rank beat another? A K Q J m>n m n J Q K A

  13. Rank Beats Rank rankBeats :: Rank -> Rank -> Bool

  14. Rank Beats Rank • When does one rank beat another? A K Q J m>n m n J Q K A

  15. Rank Beats Rank rankBeats :: Rank -> Rank -> Bool

  16. Rank Beats Rank • When does one rank beat another? A K Q J m>n m n J Q K A

  17. Rank Beats Rank rankBeats :: Rank -> Rank -> Bool rankBeats _ Ace = False Nothing beats an Ace Matches anything at all

  18. Rank Beats Rank • When does one rank beat another? A K Q J m>n m n J Q K A

  19. Rank Beats Rank rankBeats :: Rank -> Rank -> Bool rankBeats _ Ace = False An Ace beats anything else rankBeats Ace _ = True Used only if the first equation does not match.

  20. Rank Beats Rank • When does one rank beat another? A K Q J m>n m n J Q K A

  21. Rank Beats Rank rankBeats :: Rank -> Rank -> Bool rankBeats _ Ace = False rankBeats Ace _ = True rankBeats _ King = False rankBeats King _ = True

  22. Rank Beats Rank • When does one rank beat another? A K Q J m>n m n J Q K A

  23. Rank Beats Rank rankBeats :: Rank -> Rank -> Bool rankBeats _ Ace = False rankBeats Ace _ = True rankBeats _ King = False rankBeats King _ = True rankBeats _ Queen = False rankBeats Queen _ = True rankBeats _ Jack = False rankBeats Jack _ = True

  24. Rank Beats Rank • When does one rank beat another? A K Q J m>n m n J Q K A

  25. Rank Beats Rank rankBeats :: Rank -> Rank -> Bool rankBeats _ Ace = False rankBeats Ace _ = True 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 Names the number Match Numeric 7, in the rank for example

  26. Examples Main> rankBeats Jack (Numeric 7) True Main> rankBeats (Numeric 10) Queen False

  27. Modelling a Card • A Card has both a Rank and a Suit data Card = Card Rank Suit deriving Show • Define functions to inspect both rank :: Card -> Rank rank (Card r s) = r suit :: Card -> Suit suit (Card r s) = s

  28. When does one card beat another? • When both cards have the same suit, and the rank is higher can be written down simpler... cardBeats :: Card -> Card -> Bool cardBeats c c' | suit c == suit c' = rankBeats (rank c) (rank c') | otherwise = False data Suit = Spades | Hearts | Diamonds | Clubs deriving (Show, Eq)

  29. When does one card beat another? • When both cards have the same suit, and the rank is higher cardBeats :: Card -> Card -> Bool cardBeats c c' = suit c == suit c’ && rankBeats (rank c) (rank c')

  30. Modelling a Hand of Cards • A hand may contain any number of cards from zero up! data Hand = Cards Card … Card We can’t deriving Show use …!!! • The solution is… recursion!

  31. Modelling a Hand of Cards • A hand may contain any number of cards from zero up! – A hand may be empty very much like a – It may consist of a first card and the rest list... • The rest is another hand of cards! data Hand = Empty | Some Card Hand deriving Show Solve the problem of modelling a hand with A recursive type! one fewer cards!

  32. When can a hand beat a card? • An empty hand beats nothing • A non-empty hand can beat a card if the first card can, or the rest of the hand can! handBeats :: Hand -> Card -> Bool handBeats Empty card = False handBeats (Some c h) card = cardBeats c card || handBeats h card • A recursive function!

  33. Discarding the first card • Discarding the first card: discard :: Hand -> Hand discard :: Hand -> Hand discard :: Hand -> Hand discard (Some c h) = h ... discard (Some c h) = h discard Empty = error “no card to discard”

  34. What Did We Learn? • Modelling the problem using datatypes with components • Using recursive datatypes to model things of varying size • Using recursive functions to manipulate recursive datatypes

  35. Lists -- how they work

  36. Lists data List = Empty | Some ?? List • A list is either: – An empty list – With at least one (first) element, and the rest • What to put on the place of the ??

  37. Lists data List a = Empty | Some a (List a) • A type parameter • Some 12 (Some 3 Empty) :: List Integer • Some ”apa” (Some ”bepa” Empty) :: List String

  38. Lists data List a = Empty | Some a (List a) • Empty :: List Integer • Empty :: List Bool • Empty :: List String • ...

  39. Programming Examples • tom :: List a -> Bool • forst :: List a -> a • sist :: List a -> a • size :: List a -> Integer • summan :: List Integer -> Integer

  40. Summary • Datatypes model data – Constructor functions with 0, 1 or more arguments • Recursive datatypes – When the size and shap can change – Recursive functions • Type parameter – For generalizing over the content

Recommend


More recommend