modelling datatypes
play

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

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend