Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Taking a Gamble with F#
Implementing Blackjack
Cameron Presley
@PCameronPresley
http://Blog.TheSoftwareMentor.com
Little About Myself
 Senior Software Engineer at Pilot/Flying J
 Musician and Board gamer
 Co-organizer of @FunctionalK...
Goals
 Explore the different types in F# and the when to use them
 Demonstrate how to use these types to model Blackjack...
Types
Overview
 How to hold data
 Collections
 Combining different types as one
Know When to Hold Them
Holding Data
Source
Holding Data
Tuples
 Provides a way to model all possible combinations of types
 A tuple of int*string would represent a...
Holding Data
Tuples
Holding Data
Tuples
 Advantages
 Create on the fly
 Easy to break down
 Disadvantages
 Parameters have to be in order...
Holding Data
Tuples
Holding Data
Tuples
 When Should You Use Tuples?
 When working within a function
 When there are few parameters
 When ...
Holding Data
Records
 Like a tuple, provides a way to model all possible combinations of a value
 Key Differences
 Must...
Holding Data
Records
Holding Data
Records
 Advantages
 Order doesn’t matter
 Named parameters
 Easy to retrieve a value
 Disadvantages
 C...
Holding Data
Records
 When Should You Use Records?
 Representing domain models
 Working with a lot of parameters
 Prov...
Holding Data
Review
 Tuples
 Create on the fly
 Easy to break down into separate values
 Records
 Representing domain...
Collections
Collections
Sequences
 Provides a way to define the collection by using a generator function
 Lazy by default
 Only cre...
Collections
Sequences
Collections
Sequences
 Advantages
 Can model an infinite collection
 Provides a way to generate all values
 Only compu...
Collections
Lists
 Represents a collection as two parts, the first element, and the rest of the list
 First element refe...
Collections
Lists
Collections
Lists
 Advantages
 Can define recursive functions to process element by element
 Adding additional elements...
Collections
Arrays
 Represents a collection as a dictionary such that the index finds the value
 Long story short, simil...
Collections
Arrays
Collections
Arrays
 Advantages
 Quick lookup -> O(1)
 Can change one element in the array with a different element -> O...
Collections
Summary
 Sequences
 IEnumerable from C#
 Should use when all values can be generated by a function or when ...
Combining Different Types
Discriminated Unions
Combining Different Types
Discriminated Unions
 Discriminated Unions provides a way to specify that a type can be one of ...
Combining Different Types
Discriminated Unions
Combining Different Types
Discriminated Unions
Combining Different Types
Discriminated Unions
Combining Different Types
Discriminated Unions
 Now I needed to create a new coordinate and I do this:
 What’s to stop m...
Combining Different Types
Discriminated Unions
 Problem is that Lat and Long are part of the domain for Coordinate
 Inst...
Combining Different Types
Discriminated Unions
Combining Different Types
Discriminated Unions
 When a primitive needs to be modeled as part of the domain
 Single Case
...
Data Type Recap
 Holding Data
 Tuples, Records
 Collections
 Sequences, Lists, Arrays
 Combining Different Types
 Di...
Modeling The Domain
Modeling The Domain
 Goals
 Identify the different models
 Implementation
Modeling The Domain
Goals
 Has to be easy to read and understand
 Easier to maintain
 Defines a ubiquitous language
 P...
Identifying Models
 Usually start big and then break down to smaller pieces
 How do we represent the entire game?
 Defi...
Identifying Models
Identifying Models
 What’s included in a game?
 Game has
 Deck
 Players
 Dealer
Identifying Models
Identifying Models
Identifying Models
 What’s a Deck?
 Represents all of the Cards that will be used in the Game
 What’s a Card?
 Combina...
Identifying Models
Identifying Models
Identifying Models
 What are Players?
 Collection of Player
 What’s a Player
 Someone playing against the Dealer
 Has...
Identifying Models
Identifying Models
 Represents the state of the Player
 Blackjack -> 2 cards worth with 21
 Busted -> Has a Score over ...
Identifying Models
Identifying Models
 Represents the final result of a Player’s Hand
 Result is based on whether the Player Busted or Stay...
Identifying Models
Identifying Models
 Competes against every Player
 Similar to Player
 Dealer has a Hand and a Status
 Unlike Player, t...
Identifying Models
Identifying Models
 Talked about the components of the game
 What about points?
 What about the actions that a player c...
Identifying Models
Identifying Models
 Cards are worth Points based on their Rank
 Face cards are worth 10 points
 Point cards are worth t...
Identifying Models
Identifying Models
 During the game, a participant can take one of two different actions
 Draw Cards (Hit)
 Adds a sing...
Identifying Models
Implementing the Domain
 We’ve broken down the domain into smaller pieces and identified dependencies
amongst the pieces
...
Implementing the Domain
Implementing the Domain
Implementing the Models
Rank
 Can be one of 13 possible values
 A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K
 What type is gr...
Implementing the Domain
Implementing the Models
Suit
 Can be one of 4 possible values
 Hearts, Clubs, Spades, Diamonds
 How should we model thi...
Implementing the Domain
Implementing the Models
Card
 Contains both a Rank and Suit
 What type is great for holding data?
Implementing the Domain
Implementing the Models
Deck
 Contains 1 or more Cards
 What are some properties of a Deck?
 Length will change through...
Implementing the Domain
Implementing the Models
Hand
 Contains the Cards for a Player
 Initially starts with two cards, but can draw more during...
Implementing the Domain
Implementing the Models
Score
 Represents the final value of a Hand
 Can only be one value (integer)
 What’s a way to w...
Implementing the Domain
Implementing the Models
Status
 Blackjack
 Player has two cards and their score is 21
 Busted
 Player went over 21 and...
Implementing the Models
Status
 Can be one of a finite number of choices
 Some of the type require Score and other ones ...
Implementing the Domain
Implementing the Models
Dealer
 A Dealer contains
 Hand
 Status
 How should we model this?
Implementing the Domain
Implementing the Models
Player
 A Player contains
 Hand
 Status
 ID
 How should we model this?
Implementing the Domain
Implementing the Models
Players
 Represents all the players in the Game
 Number of Players won’t change during the game
...
Implementing the Domain
Implementing the Models
Game
 Contains
 Deck
 Players
 Dealer
 How should we model this?
Implementing the Domain
Implementing the Models
Points
 Every Card is worth a value based on the Rank
 One of two possible values
 Aces can be ...
Implementing the Domain
Implementing the Models
Actions
 Represents what a participant can do during the Game
 One of two possible values
 Hit
...
Implementing the Domain
Full Implementation
Implementing the Models
Summary
 Determined the models by using domain terms (ubiquitous language)
 Started with the big...
Playing the Game
Playing the Game
 Sometimes, pure functions can fail
 How can we handle this?
 We’ll look at
 Drawing a Card
 Setting...
Playing the Game
Drawing a Card
 Throughout the course of the Game, Cards will be drawn from the Deck
 Let’s create a fu...
Drawing a Card
 Are there any issues with this implementation?
 What about an empty deck?
 Match Failure Exception -> T...
Playing the Game
Drawing a Card
 Introducing the Option type!
 Special kind of Discriminated Union that handles when the...
Playing the Game
Drawing a Card
Playing the Game
Setting up a Player
 Now that we have a way to draw cards, we can now setup a Player
 Remember that a P...
Playing the Game
Setting up a Player
 Remember, drawCard returns an option, so we need to handle that.
Playing the Game
Setting up a Player
 This code is not nearly as readable as the first solution
 What are we really tryi...
Playing the Game
Setting up a Player
 By using the Maybe Builder pattern!
 Known in other FP languages as Maybe.
 Two p...
Playing the Game
Setting up a Player
Playing the Game
Setting up a Player
Playing the Game
Setting up a Player
 Problem
 Creating a Player can fail because there’s not enough cards
 Putting in ...
Wrapping Up
 Overview of the different F# types and the advantages of each
 Modeled and implemented the domain for Black...
Additional Resources
 Learning more about F#
 F# for Fun and Profit -> http://fsharpforfunandprofit.com/
 Code Solution...
Indy Code - Taking a Gamble With F#: Implementing Blackjack
Upcoming SlideShare
Loading in …5
×

of

Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 1 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 2 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 3 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 4 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 5 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 6 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 7 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 8 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 9 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 10 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 11 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 12 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 13 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 14 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 15 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 16 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 17 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 18 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 19 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 20 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 21 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 22 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 23 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 24 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 25 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 26 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 27 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 28 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 29 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 30 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 31 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 32 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 33 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 34 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 35 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 36 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 37 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 38 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 39 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 40 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 41 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 42 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 43 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 44 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 45 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 46 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 47 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 48 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 49 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 50 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 51 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 52 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 53 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 54 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 55 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 56 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 57 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 58 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 59 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 60 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 61 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 62 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 63 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 64 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 65 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 66 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 67 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 68 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 69 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 70 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 71 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 72 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 73 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 74 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 75 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 76 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 77 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 78 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 79 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 80 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 81 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 82 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 83 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 84 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 85 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 86 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 87 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 88 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 89 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 90 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 91 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 92 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 93 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 94 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 95 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 96 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 97 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 98 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 99 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 100 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 101 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 102 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 103 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 104 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 105 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 106 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 107 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 108 Indy Code - Taking a Gamble With F#: Implementing Blackjack Slide 109
Upcoming SlideShare
How Functional Programming Made Me A Better Developer
Next
Download to read offline and view in fullscreen.

0 Likes

Share

Download to read offline

Indy Code - Taking a Gamble With F#: Implementing Blackjack

Download to read offline

Have you heard a lot about about functional programming, and aren’t sure how to get started? Have you tried learning the concepts, but still having a hard time applying them to a real problem? Then this talk is for you! In this presentation I’ll walk you through how to model the classic card game, Blackjack, using F#.

Intended for developers with little to no functional experience, my talk will introduce you to the basic concepts of functional programming while applying them to Blackjack. By the end of the presentation, you’ll know the basic concepts and how to apply them.

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

Indy Code - Taking a Gamble With F#: Implementing Blackjack

  1. 1. Taking a Gamble with F# Implementing Blackjack Cameron Presley @PCameronPresley http://Blog.TheSoftwareMentor.com
  2. 2. Little About Myself  Senior Software Engineer at Pilot/Flying J  Musician and Board gamer  Co-organizer of @FunctionalKnox  “Developer Betterer”
  3. 3. Goals  Explore the different types in F# and the when to use them  Demonstrate how to use these types to model Blackjack  Show how to deal with things that can fail
  4. 4. Types Overview  How to hold data  Collections  Combining different types as one
  5. 5. Know When to Hold Them Holding Data Source
  6. 6. Holding Data Tuples  Provides a way to model all possible combinations of types  A tuple of int*string would represent all combinations of integer and strings  A triple of int*string*int would represent all combinations of integer, string, and integer
  7. 7. Holding Data Tuples
  8. 8. Holding Data Tuples  Advantages  Create on the fly  Easy to break down  Disadvantages  Parameters have to be in order (int*string is different from string*int)  Hard to keep values in the right order (int*int*int)  Doesn’t provide a lot of type safety
  9. 9. Holding Data Tuples
  10. 10. Holding Data Tuples  When Should You Use Tuples?  When working within a function  When there are few parameters  When Should You NOT Use Tuples?  Representing a domain model  Need more type safety  Representing the same data types (i.e. int*int*int)  Can be hard to remember which element represents which
  11. 11. Holding Data Records  Like a tuple, provides a way to model all possible combinations of a value  Key Differences  Must define as a type  Provides labels (i.e. dot syntax)  Order doesn’t matter
  12. 12. Holding Data Records
  13. 13. Holding Data Records  Advantages  Order doesn’t matter  Named parameters  Easy to retrieve a value  Disadvantages  Can’t create on the fly  Verbose definition
  14. 14. Holding Data Records  When Should You Use Records?  Representing domain models  Working with a lot of parameters  Providing better type safety  When Should You NOT Use Records?  Intermediate results for a function
  15. 15. Holding Data Review  Tuples  Create on the fly  Easy to break down into separate values  Records  Representing domain models  Working with a lot of parameters  Providing better type safety
  16. 16. Collections
  17. 17. Collections Sequences  Provides a way to define the collection by using a generator function  Lazy by default  Only creates values when iterated  Similar to IEnumerable from C#
  18. 18. Collections Sequences
  19. 19. Collections Sequences  Advantages  Can model an infinite collection  Provides a way to generate all values  Only computes values when needed  Disadvantages  Expensive to add a value -> O(n)  Retrieving an item by index is slow -> O(n)  Can’t modify elements in place
  20. 20. Collections Lists  Represents a collection as two parts, the first element, and the rest of the list  First element referred to as the head  Rest of the list is referred to as tail  Similar to linked lists  Typically used with recursion, pattern matching, and the :: (cons) operator
  21. 21. Collections Lists
  22. 22. Collections Lists  Advantages  Can define recursive functions to process element by element  Adding additional elements is fast -> O(1)  Can be defined with a generator function  Disadvantages  Can’t model infinite series  Indexing to an element is slow -> O(n)  Can’t modify elements in place
  23. 23. Collections Arrays  Represents a collection as a dictionary such that the index finds the value  Long story short, similar to arrays in other languages  Typically used when lookup speed matters
  24. 24. Collections Arrays
  25. 25. Collections Arrays  Advantages  Quick lookup -> O(1)  Can change one element in the array with a different element -> O(1)  Can model multidimensional data (2D arrays)  Disadvantages  Can’t model infinite series  Adding additional elements is slow -> O(n)
  26. 26. Collections Summary  Sequences  IEnumerable from C#  Should use when all values can be generated by a function or when modeling an infinite series  Lists  Linked lists  Great for when the number of elements can change or when processing element by element  Arrays  Similar to traditional arrays  Best used when certain elements need to change or for quick access
  27. 27. Combining Different Types Discriminated Unions
  28. 28. Combining Different Types Discriminated Unions  Discriminated Unions provides a way to specify that a type can be one of many different types  The Difference between Tuples/Records and Discriminated Unions (DUs)  Tuples/Records -> int*string (all combinations of integer and string)  DUs -> int | string (either it’s an integer or a string)  Typically used with pattern matching
  29. 29. Combining Different Types Discriminated Unions
  30. 30. Combining Different Types Discriminated Unions
  31. 31. Combining Different Types Discriminated Unions
  32. 32. Combining Different Types Discriminated Unions  Now I needed to create a new coordinate and I do this:  What’s to stop me from making this error?
  33. 33. Combining Different Types Discriminated Unions  Problem is that Lat and Long are part of the domain for Coordinate  Instead of modeling them as floats, they should have their own type  But float is the correct data type, so how I create a type that wraps around a float?  Single Case Discriminated Unions!
  34. 34. Combining Different Types Discriminated Unions
  35. 35. Combining Different Types Discriminated Unions  When a primitive needs to be modeled as part of the domain  Single Case  When different type signatures actually model the same thing  Combining different types  When there are a finite number of possibilities  Enum Style
  36. 36. Data Type Recap  Holding Data  Tuples, Records  Collections  Sequences, Lists, Arrays  Combining Different Types  Discriminated Unions
  37. 37. Modeling The Domain
  38. 38. Modeling The Domain  Goals  Identify the different models  Implementation
  39. 39. Modeling The Domain Goals  Has to be easy to read and understand  Easier to maintain  Defines a ubiquitous language  Provides a way for developers, QA, and users to communicate  Make illegal states unrepresentable  Why allow bad data to be created?
  40. 40. Identifying Models  Usually start big and then break down to smaller pieces  How do we represent the entire game?  Define a Game type
  41. 41. Identifying Models
  42. 42. Identifying Models  What’s included in a game?  Game has  Deck  Players  Dealer
  43. 43. Identifying Models
  44. 44. Identifying Models
  45. 45. Identifying Models  What’s a Deck?  Represents all of the Cards that will be used in the Game  What’s a Card?  Combination of Rank and Suit  What’s a Rank  One of 13 possible values  A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K  What’s a Suit  One of 4 possible values  Hearts, Clubs, Spades, Diamonds
  46. 46. Identifying Models
  47. 47. Identifying Models
  48. 48. Identifying Models  What are Players?  Collection of Player  What’s a Player  Someone playing against the Dealer  Has both a Hand and a Status  What’s a Hand?  Represent the Cards a Player has
  49. 49. Identifying Models
  50. 50. Identifying Models  Represents the state of the Player  Blackjack -> 2 cards worth with 21  Busted -> Has a Score over 21  Stayed -> Not Blackjack and a Score of 21 or less  Cards Dealt -> Hasn’t taken a turn yet
  51. 51. Identifying Models
  52. 52. Identifying Models  Represents the final result of a Player’s Hand  Result is based on whether the Player Busted or Stayed  Can only be of one value (integer)  Important to know when comparing who won
  53. 53. Identifying Models
  54. 54. Identifying Models  Competes against every Player  Similar to Player  Dealer has a Hand and a Status  Unlike Player, there’s only one, so no ID is needed
  55. 55. Identifying Models
  56. 56. Identifying Models  Talked about the components of the game  What about points?  What about the actions that a player can take?
  57. 57. Identifying Models
  58. 58. Identifying Models  Cards are worth Points based on their Rank  Face cards are worth 10 points  Point cards are worth that many  (2’s worth 2, 3’s worth 3 …, 10’s worth 10)  Aces can be counted as 1 or 11
  59. 59. Identifying Models
  60. 60. Identifying Models  During the game, a participant can take one of two different actions  Draw Cards (Hit)  Adds a single card to their Hand  Stay  Stops drawing cards
  61. 61. Identifying Models
  62. 62. Implementing the Domain  We’ve broken down the domain into smaller pieces and identified dependencies amongst the pieces  Time to implement the pieces in a bottom-up order
  63. 63. Implementing the Domain
  64. 64. Implementing the Domain
  65. 65. Implementing the Models Rank  Can be one of 13 possible values  A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K  What type is great for modeling a finite set of values?
  66. 66. Implementing the Domain
  67. 67. Implementing the Models Suit  Can be one of 4 possible values  Hearts, Clubs, Spades, Diamonds  How should we model this?
  68. 68. Implementing the Domain
  69. 69. Implementing the Models Card  Contains both a Rank and Suit  What type is great for holding data?
  70. 70. Implementing the Domain
  71. 71. Implementing the Models Deck  Contains 1 or more Cards  What are some properties of a Deck?  Length will change throughout the game  Which collection type should we use to model this?
  72. 72. Implementing the Domain
  73. 73. Implementing the Models Hand  Contains the Cards for a Player  Initially starts with two cards, but can draw more during the game  How should we model this?
  74. 74. Implementing the Domain
  75. 75. Implementing the Models Score  Represents the final value of a Hand  Can only be one value (integer)  What’s a way to wrap primitives as their own type?
  76. 76. Implementing the Domain
  77. 77. Implementing the Models Status  Blackjack  Player has two cards and their score is 21  Busted  Player went over 21 and that’s their final score  Stayed  Player decided to not take any more Cards and that’s their final score  Cards Dealt  Player hasn’t taken their turn
  78. 78. Implementing the Models Status  Can be one of a finite number of choices  Some of the type require Score and other ones don’t  How should we model this?
  79. 79. Implementing the Domain
  80. 80. Implementing the Models Dealer  A Dealer contains  Hand  Status  How should we model this?
  81. 81. Implementing the Domain
  82. 82. Implementing the Models Player  A Player contains  Hand  Status  ID  How should we model this?
  83. 83. Implementing the Domain
  84. 84. Implementing the Models Players  Represents all the players in the Game  Number of Players won’t change during the game  Each player must finish their turn before the next player can start  Which collection type should we use?
  85. 85. Implementing the Domain
  86. 86. Implementing the Models Game  Contains  Deck  Players  Dealer  How should we model this?
  87. 87. Implementing the Domain
  88. 88. Implementing the Models Points  Every Card is worth a value based on the Rank  One of two possible values  Aces can be worth 1 or 11  Everything else can be worth one value  Need to combine two different types as one, how should we model this?
  89. 89. Implementing the Domain
  90. 90. Implementing the Models Actions  Represents what a participant can do during the Game  One of two possible values  Hit  Stay  Finite number of choices, how to model?
  91. 91. Implementing the Domain
  92. 92. Full Implementation
  93. 93. Implementing the Models Summary  Determined the models by using domain terms (ubiquitous language)  Started with the biggest model (Game) and broke it down into smaller pieces and then repeating the process with the smaller pieces  After finding the models, implemented the models in a bottom-up fashion  Able to define the domain in a way such that bad states are unrepresentable
  94. 94. Playing the Game
  95. 95. Playing the Game  Sometimes, pure functions can fail  How can we handle this?  We’ll look at  Drawing a Card  Setting up a Player
  96. 96. Playing the Game Drawing a Card  Throughout the course of the Game, Cards will be drawn from the Deck  Let’s create a function, drawCard that takes a Deck as input and returns the top Card and the rest of the Deck as output
  97. 97. Drawing a Card  Are there any issues with this implementation?  What about an empty deck?  Match Failure Exception -> The match cases were incomplete  How can we model a type that may have a value or not?
  98. 98. Playing the Game Drawing a Card  Introducing the Option type!  Special kind of Discriminated Union that handles when there’s a value and when there isn’t.  Let’s rewrite the drawCard function to handle an empty deck
  99. 99. Playing the Game Drawing a Card
  100. 100. Playing the Game Setting up a Player  Now that we have a way to draw cards, we can now setup a Player  Remember that a Player starts off with a Hand of two cards and a Status of CardsDealt
  101. 101. Playing the Game Setting up a Player  Remember, drawCard returns an option, so we need to handle that.
  102. 102. Playing the Game Setting up a Player  This code is not nearly as readable as the first solution  What are we really trying to accomplish?  Try to draw two cards, if so, return Some Player, otherwise, None  Wouldn’t it be nice if we could have the short-circuit logic of the second solution, but still have the readability of the happy path?  How can we work around all the pattern matching?
  103. 103. Playing the Game Setting up a Player  By using the Maybe Builder pattern!  Known in other FP languages as Maybe.  Two parts  Provides a way to short-circuit logic if the input is None (called Bind)  A way to wrap a value as an option (called Return)
  104. 104. Playing the Game Setting up a Player
  105. 105. Playing the Game Setting up a Player
  106. 106. Playing the Game Setting up a Player  Problem  Creating a Player can fail because there’s not enough cards  Putting in the error handling code makes it cluttered and hard to read  Solution  Using the Maybe pattern, we can short-circuit our function flow to return None before calling anything else  When to Use  Lots of nested pattern matching on options
  107. 107. Wrapping Up  Overview of the different F# types and the advantages of each  Modeled and implemented the domain for Blackjack using the different types  Explored how to handle functions that can fail
  108. 108. Additional Resources  Learning more about F#  F# for Fun and Profit -> http://fsharpforfunandprofit.com/  Code Solution  Blackjack Repo -> https://github.com/cameronpresley/Blackjack  How to find me  Twitter ->@pcameronpresley  Blog -> http://blog.thesoftwarementor.com

Have you heard a lot about about functional programming, and aren’t sure how to get started? Have you tried learning the concepts, but still having a hard time applying them to a real problem? Then this talk is for you! In this presentation I’ll walk you through how to model the classic card game, Blackjack, using F#. Intended for developers with little to no functional experience, my talk will introduce you to the basic concepts of functional programming while applying them to Blackjack. By the end of the presentation, you’ll know the basic concepts and how to apply them.

Views

Total views

636

On Slideshare

0

From embeds

0

Number of embeds

2

Actions

Downloads

11

Shares

0

Comments

0

Likes

0

×