SlideShare a Scribd company logo
1 of 109
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 @FunctionalKnox
 “Developer Betterer”
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
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 all combinations of integer and strings
 A triple of int*string*int would represent all combinations of integer, string, and
integer
Holding Data
Tuples
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
Holding Data
Tuples
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
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
Holding Data
Records
Holding Data
Records
 Advantages
 Order doesn’t matter
 Named parameters
 Easy to retrieve a value
 Disadvantages
 Can’t create on the fly
 Verbose definition
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
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
Collections
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#
Collections
Sequences
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
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
Collections
Lists
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
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
Collections
Arrays
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)
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
Combining Different Types
Discriminated Unions
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
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 me from making this error?
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!
Combining Different Types
Discriminated Unions
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
Data Type Recap
 Holding Data
 Tuples, Records
 Collections
 Sequences, Lists, Arrays
 Combining Different Types
 Discriminated Unions
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
 Provides a way for developers, QA, and users to communicate
 Make illegal states unrepresentable
 Why allow bad data to be created?
Identifying Models
 Usually start big and then break down to smaller pieces
 How do we represent the entire game?
 Define a Game type
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?
 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
Identifying Models
Identifying Models
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
Identifying Models
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
Identifying Models
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
Identifying Models
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
Identifying Models
Identifying Models
 Talked about the components of the game
 What about points?
 What about the actions that a player can take?
Identifying Models
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
Identifying Models
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
Identifying Models
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
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 great for modeling a finite set of values?
Implementing the Domain
Implementing the Models
Suit
 Can be one of 4 possible values
 Hearts, Clubs, Spades, Diamonds
 How should we model this?
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 throughout the game
 Which collection type should we use to model this?
Implementing the Domain
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?
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 wrap primitives as their own type?
Implementing the Domain
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
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?
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
 Each player must finish their turn before the next player can start
 Which collection type should we use?
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 worth 1 or 11
 Everything else can be worth one value
 Need to combine two different types as one, how should we model this?
Implementing the Domain
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?
Implementing the Domain
Full Implementation
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
Playing the Game
Playing the Game
 Sometimes, pure functions can fail
 How can we handle this?
 We’ll look at
 Drawing a Card
 Setting up a Player
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
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?
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
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 Player starts off with a Hand of two cards and a Status of
CardsDealt
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 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?
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)
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 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
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
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

More Related Content

What's hot

JavaScript Control Statements II
JavaScript Control Statements IIJavaScript Control Statements II
JavaScript Control Statements IIReem Alattas
 
Functional solid
Functional solidFunctional solid
Functional solidMatt Stine
 
Pragmatic functional refactoring with java 8
Pragmatic functional refactoring with java 8Pragmatic functional refactoring with java 8
Pragmatic functional refactoring with java 8RichardWarburton
 
The Death of Final Tagless
The Death of Final TaglessThe Death of Final Tagless
The Death of Final TaglessJohn De Goes
 
C- Programming Assignment 4 solution
C- Programming Assignment 4 solutionC- Programming Assignment 4 solution
C- Programming Assignment 4 solutionAnimesh Chaturvedi
 
Spring Batch Performance Tuning
Spring Batch Performance TuningSpring Batch Performance Tuning
Spring Batch Performance TuningGunnar Hillert
 
Introduction to kotlin coroutines
Introduction to kotlin coroutinesIntroduction to kotlin coroutines
Introduction to kotlin coroutinesNAVER Engineering
 
Introduction to Swift programming language.
Introduction to Swift programming language.Introduction to Swift programming language.
Introduction to Swift programming language.Icalia Labs
 
Scala categorytheory
Scala categorytheoryScala categorytheory
Scala categorytheoryKnoldus Inc.
 
Discovering functional treasure in idiomatic Groovy
Discovering functional treasure in idiomatic GroovyDiscovering functional treasure in idiomatic Groovy
Discovering functional treasure in idiomatic GroovyNaresha K
 
Testable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVMTestable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVMFabio Collini
 
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹Johnny Sung
 

What's hot (20)

C Programming Exam problems & Solution by sazzad hossain
C Programming Exam problems & Solution by sazzad hossainC Programming Exam problems & Solution by sazzad hossain
C Programming Exam problems & Solution by sazzad hossain
 
JavaScript Control Statements II
JavaScript Control Statements IIJavaScript Control Statements II
JavaScript Control Statements II
 
Java exception-handling
Java exception-handlingJava exception-handling
Java exception-handling
 
Java programs
Java programsJava programs
Java programs
 
Monadic Java
Monadic JavaMonadic Java
Monadic Java
 
Functional solid
Functional solidFunctional solid
Functional solid
 
Pragmatic functional refactoring with java 8
Pragmatic functional refactoring with java 8Pragmatic functional refactoring with java 8
Pragmatic functional refactoring with java 8
 
The Death of Final Tagless
The Death of Final TaglessThe Death of Final Tagless
The Death of Final Tagless
 
Function lecture
Function lectureFunction lecture
Function lecture
 
C- Programming Assignment 4 solution
C- Programming Assignment 4 solutionC- Programming Assignment 4 solution
C- Programming Assignment 4 solution
 
Epoxy 介紹
Epoxy 介紹Epoxy 介紹
Epoxy 介紹
 
Spring Batch Performance Tuning
Spring Batch Performance TuningSpring Batch Performance Tuning
Spring Batch Performance Tuning
 
Introduction to kotlin coroutines
Introduction to kotlin coroutinesIntroduction to kotlin coroutines
Introduction to kotlin coroutines
 
Introduction to Swift programming language.
Introduction to Swift programming language.Introduction to Swift programming language.
Introduction to Swift programming language.
 
Java Basics
Java BasicsJava Basics
Java Basics
 
Scala categorytheory
Scala categorytheoryScala categorytheory
Scala categorytheory
 
Exception handling in java
Exception handling  in javaException handling  in java
Exception handling in java
 
Discovering functional treasure in idiomatic Groovy
Discovering functional treasure in idiomatic GroovyDiscovering functional treasure in idiomatic Groovy
Discovering functional treasure in idiomatic Groovy
 
Testable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVMTestable Android Apps using data binding and MVVM
Testable Android Apps using data binding and MVVM
 
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
 

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

IntroductionToCSharp.ppt
IntroductionToCSharp.pptIntroductionToCSharp.ppt
IntroductionToCSharp.pptRishikaRuhela
 
Introduction toc sharp
Introduction toc sharpIntroduction toc sharp
Introduction toc sharpSDFG5
 
IntroductionToCSharp.ppt
IntroductionToCSharp.pptIntroductionToCSharp.ppt
IntroductionToCSharp.pptReemaAsker1
 
IntroductionToCSharp.ppt
IntroductionToCSharp.pptIntroductionToCSharp.ppt
IntroductionToCSharp.pptReemaAsker1
 
Workshop södertörn jan 2014 intermittent version
Workshop södertörn jan 2014 intermittent versionWorkshop södertörn jan 2014 intermittent version
Workshop södertörn jan 2014 intermittent versionStaffan Björk
 
MongoDB.local Berlin: How to add your favorite language to MongoDB Compass
MongoDB.local Berlin: How to add your favorite language to MongoDB CompassMongoDB.local Berlin: How to add your favorite language to MongoDB Compass
MongoDB.local Berlin: How to add your favorite language to MongoDB CompassMongoDB
 
Programming construction tools
Programming construction toolsProgramming construction tools
Programming construction toolssunilchute1
 
It's Not You. It's Your Data Model.
It's Not You. It's Your Data Model.It's Not You. It's Your Data Model.
It's Not You. It's Your Data Model.Alex Powers
 
DITEC - Programming with C#.NET
DITEC - Programming with C#.NETDITEC - Programming with C#.NET
DITEC - Programming with C#.NETRasan Samarasinghe
 
DISE - Windows Based Application Development in C#
DISE - Windows Based Application Development in C#DISE - Windows Based Application Development in C#
DISE - Windows Based Application Development in C#Rasan Samarasinghe
 
C# lecture 2: Literals , Variables and Data Types in C#
C# lecture 2: Literals , Variables and Data Types in C#C# lecture 2: Literals , Variables and Data Types in C#
C# lecture 2: Literals , Variables and Data Types in C#Dr.Neeraj Kumar Pandey
 
Designing Optimized Symbols for InduSoft Web Studio Projects
Designing Optimized Symbols for InduSoft Web Studio ProjectsDesigning Optimized Symbols for InduSoft Web Studio Projects
Designing Optimized Symbols for InduSoft Web Studio ProjectsAVEVA
 
Style & Design Principles 01 - Code Style & Structure
Style & Design Principles 01 - Code Style & StructureStyle & Design Principles 01 - Code Style & Structure
Style & Design Principles 01 - Code Style & StructureNick Pruehs
 
Reinventing the Transaction Script (NDC London 2020)
Reinventing the Transaction Script (NDC London 2020)Reinventing the Transaction Script (NDC London 2020)
Reinventing the Transaction Script (NDC London 2020)Scott Wlaschin
 
Machine Learning Lecture 3 Decision Trees
Machine Learning Lecture 3 Decision TreesMachine Learning Lecture 3 Decision Trees
Machine Learning Lecture 3 Decision Treesananth
 
Modern_2.pptx for java
Modern_2.pptx for java Modern_2.pptx for java
Modern_2.pptx for java MayaTofik
 

Similar to Indy Code - Taking a Gamble With F#: Implementing Blackjack (20)

Introduction To C#
Introduction To C#Introduction To C#
Introduction To C#
 
IntroductionToCSharp.ppt
IntroductionToCSharp.pptIntroductionToCSharp.ppt
IntroductionToCSharp.ppt
 
Introduction toc sharp
Introduction toc sharpIntroduction toc sharp
Introduction toc sharp
 
IntroductionToCSharp.ppt
IntroductionToCSharp.pptIntroductionToCSharp.ppt
IntroductionToCSharp.ppt
 
IntroductionToCSharp.ppt
IntroductionToCSharp.pptIntroductionToCSharp.ppt
IntroductionToCSharp.ppt
 
C#
C#C#
C#
 
Sam python pro_points_slide
Sam python pro_points_slideSam python pro_points_slide
Sam python pro_points_slide
 
Session1
Session1Session1
Session1
 
Workshop södertörn jan 2014 intermittent version
Workshop södertörn jan 2014 intermittent versionWorkshop södertörn jan 2014 intermittent version
Workshop södertörn jan 2014 intermittent version
 
MongoDB.local Berlin: How to add your favorite language to MongoDB Compass
MongoDB.local Berlin: How to add your favorite language to MongoDB CompassMongoDB.local Berlin: How to add your favorite language to MongoDB Compass
MongoDB.local Berlin: How to add your favorite language to MongoDB Compass
 
Programming construction tools
Programming construction toolsProgramming construction tools
Programming construction tools
 
It's Not You. It's Your Data Model.
It's Not You. It's Your Data Model.It's Not You. It's Your Data Model.
It's Not You. It's Your Data Model.
 
DITEC - Programming with C#.NET
DITEC - Programming with C#.NETDITEC - Programming with C#.NET
DITEC - Programming with C#.NET
 
DISE - Windows Based Application Development in C#
DISE - Windows Based Application Development in C#DISE - Windows Based Application Development in C#
DISE - Windows Based Application Development in C#
 
C# lecture 2: Literals , Variables and Data Types in C#
C# lecture 2: Literals , Variables and Data Types in C#C# lecture 2: Literals , Variables and Data Types in C#
C# lecture 2: Literals , Variables and Data Types in C#
 
Designing Optimized Symbols for InduSoft Web Studio Projects
Designing Optimized Symbols for InduSoft Web Studio ProjectsDesigning Optimized Symbols for InduSoft Web Studio Projects
Designing Optimized Symbols for InduSoft Web Studio Projects
 
Style & Design Principles 01 - Code Style & Structure
Style & Design Principles 01 - Code Style & StructureStyle & Design Principles 01 - Code Style & Structure
Style & Design Principles 01 - Code Style & Structure
 
Reinventing the Transaction Script (NDC London 2020)
Reinventing the Transaction Script (NDC London 2020)Reinventing the Transaction Script (NDC London 2020)
Reinventing the Transaction Script (NDC London 2020)
 
Machine Learning Lecture 3 Decision Trees
Machine Learning Lecture 3 Decision TreesMachine Learning Lecture 3 Decision Trees
Machine Learning Lecture 3 Decision Trees
 
Modern_2.pptx for java
Modern_2.pptx for java Modern_2.pptx for java
Modern_2.pptx for java
 

More from Cameron Presley

The Engineer's Playbook: Starting a New Role
The Engineer's Playbook: Starting a New RoleThe Engineer's Playbook: Starting a New Role
The Engineer's Playbook: Starting a New RoleCameron Presley
 
Taking a Gamble with Functional Domain Modeling
Taking a Gamble with Functional Domain ModelingTaking a Gamble with Functional Domain Modeling
Taking a Gamble with Functional Domain ModelingCameron Presley
 
Level Up Your Functional Programming Skills with LINQ
Level Up Your Functional Programming Skills with LINQLevel Up Your Functional Programming Skills with LINQ
Level Up Your Functional Programming Skills with LINQCameron Presley
 
Functional Programming Through Construction : First Principles
Functional Programming Through Construction : First PrinciplesFunctional Programming Through Construction : First Principles
Functional Programming Through Construction : First PrinciplesCameron Presley
 
Establishing a SOLID Foundation
Establishing a SOLID FoundationEstablishing a SOLID Foundation
Establishing a SOLID FoundationCameron Presley
 
How Functional Programming Made Me a Better Developer
How Functional Programming Made Me a Better DeveloperHow Functional Programming Made Me a Better Developer
How Functional Programming Made Me a Better DeveloperCameron Presley
 
How to Have Code Reviews That Developers Actually Want
How to Have Code Reviews That Developers Actually WantHow to Have Code Reviews That Developers Actually Want
How to Have Code Reviews That Developers Actually WantCameron Presley
 
Making the Unstable Stable - An Intro To Testing
Making the Unstable Stable - An Intro To TestingMaking the Unstable Stable - An Intro To Testing
Making the Unstable Stable - An Intro To TestingCameron Presley
 
How Functional Programming Made Me A Better Developer
How Functional Programming Made Me A Better DeveloperHow Functional Programming Made Me A Better Developer
How Functional Programming Made Me A Better DeveloperCameron Presley
 
Establishing a SOLID Foundation - An Intro to Software Design
Establishing a SOLID Foundation - An Intro to Software DesignEstablishing a SOLID Foundation - An Intro to Software Design
Establishing a SOLID Foundation - An Intro to Software DesignCameron Presley
 

More from Cameron Presley (10)

The Engineer's Playbook: Starting a New Role
The Engineer's Playbook: Starting a New RoleThe Engineer's Playbook: Starting a New Role
The Engineer's Playbook: Starting a New Role
 
Taking a Gamble with Functional Domain Modeling
Taking a Gamble with Functional Domain ModelingTaking a Gamble with Functional Domain Modeling
Taking a Gamble with Functional Domain Modeling
 
Level Up Your Functional Programming Skills with LINQ
Level Up Your Functional Programming Skills with LINQLevel Up Your Functional Programming Skills with LINQ
Level Up Your Functional Programming Skills with LINQ
 
Functional Programming Through Construction : First Principles
Functional Programming Through Construction : First PrinciplesFunctional Programming Through Construction : First Principles
Functional Programming Through Construction : First Principles
 
Establishing a SOLID Foundation
Establishing a SOLID FoundationEstablishing a SOLID Foundation
Establishing a SOLID Foundation
 
How Functional Programming Made Me a Better Developer
How Functional Programming Made Me a Better DeveloperHow Functional Programming Made Me a Better Developer
How Functional Programming Made Me a Better Developer
 
How to Have Code Reviews That Developers Actually Want
How to Have Code Reviews That Developers Actually WantHow to Have Code Reviews That Developers Actually Want
How to Have Code Reviews That Developers Actually Want
 
Making the Unstable Stable - An Intro To Testing
Making the Unstable Stable - An Intro To TestingMaking the Unstable Stable - An Intro To Testing
Making the Unstable Stable - An Intro To Testing
 
How Functional Programming Made Me A Better Developer
How Functional Programming Made Me A Better DeveloperHow Functional Programming Made Me A Better Developer
How Functional Programming Made Me A Better Developer
 
Establishing a SOLID Foundation - An Intro to Software Design
Establishing a SOLID Foundation - An Intro to Software DesignEstablishing a SOLID Foundation - An Intro to Software Design
Establishing a SOLID Foundation - An Intro to Software Design
 

Recently uploaded

StrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi.pdf
StrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi.pdfStrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi.pdf
StrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi.pdfsteffenkarlsson2
 
Secure Software Ecosystem Teqnation 2024
Secure Software Ecosystem Teqnation 2024Secure Software Ecosystem Teqnation 2024
Secure Software Ecosystem Teqnation 2024Soroosh Khodami
 
Workforce Efficiency with Employee Time Tracking Software.pdf
Workforce Efficiency with Employee Time Tracking Software.pdfWorkforce Efficiency with Employee Time Tracking Software.pdf
Workforce Efficiency with Employee Time Tracking Software.pdfDeskTrack
 
A Guideline to Zendesk to Re:amaze Data Migration
A Guideline to Zendesk to Re:amaze Data MigrationA Guideline to Zendesk to Re:amaze Data Migration
A Guideline to Zendesk to Re:amaze Data MigrationHelp Desk Migration
 
SQL Injection Introduction and Prevention
SQL Injection Introduction and PreventionSQL Injection Introduction and Prevention
SQL Injection Introduction and PreventionMohammed Fazuluddin
 
INGKA DIGITAL: Linked Metadata by Design
INGKA DIGITAL: Linked Metadata by DesignINGKA DIGITAL: Linked Metadata by Design
INGKA DIGITAL: Linked Metadata by DesignNeo4j
 
AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...
AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...
AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...Alluxio, Inc.
 
Crafting the Perfect Measurement Sheet with PLM Integration
Crafting the Perfect Measurement Sheet with PLM IntegrationCrafting the Perfect Measurement Sheet with PLM Integration
Crafting the Perfect Measurement Sheet with PLM IntegrationWave PLM
 
Entropy, Software Quality, and Innovation (presented at Princeton Plasma Phys...
Entropy, Software Quality, and Innovation (presented at Princeton Plasma Phys...Entropy, Software Quality, and Innovation (presented at Princeton Plasma Phys...
Entropy, Software Quality, and Innovation (presented at Princeton Plasma Phys...Andrea Goulet
 
How to pick right visual testing tool.pdf
How to pick right visual testing tool.pdfHow to pick right visual testing tool.pdf
How to pick right visual testing tool.pdfTestgrid.io
 
JustNaik Solution Deck (stage bus sector)
JustNaik Solution Deck (stage bus sector)JustNaik Solution Deck (stage bus sector)
JustNaik Solution Deck (stage bus sector)Max Lee
 
AI/ML Infra Meetup | Perspective on Deep Learning Framework
AI/ML Infra Meetup | Perspective on Deep Learning FrameworkAI/ML Infra Meetup | Perspective on Deep Learning Framework
AI/ML Infra Meetup | Perspective on Deep Learning FrameworkAlluxio, Inc.
 
KLARNA - Language Models and Knowledge Graphs: A Systems Approach
KLARNA -  Language Models and Knowledge Graphs: A Systems ApproachKLARNA -  Language Models and Knowledge Graphs: A Systems Approach
KLARNA - Language Models and Knowledge Graphs: A Systems ApproachNeo4j
 
Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...rajkumar669520
 
AI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in MichelangeloAI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in MichelangeloAlluxio, Inc.
 
10 Essential Software Testing Tools You Need to Know About.pdf
10 Essential Software Testing Tools You Need to Know About.pdf10 Essential Software Testing Tools You Need to Know About.pdf
10 Essential Software Testing Tools You Need to Know About.pdfkalichargn70th171
 
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAGAI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAGAlluxio, Inc.
 
What need to be mastered as AI-Powered Java Developers
What need to be mastered as AI-Powered Java DevelopersWhat need to be mastered as AI-Powered Java Developers
What need to be mastered as AI-Powered Java DevelopersEmilyJiang23
 

Recently uploaded (20)

StrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi.pdf
StrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi.pdfStrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi.pdf
StrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi.pdf
 
Secure Software Ecosystem Teqnation 2024
Secure Software Ecosystem Teqnation 2024Secure Software Ecosystem Teqnation 2024
Secure Software Ecosystem Teqnation 2024
 
Workforce Efficiency with Employee Time Tracking Software.pdf
Workforce Efficiency with Employee Time Tracking Software.pdfWorkforce Efficiency with Employee Time Tracking Software.pdf
Workforce Efficiency with Employee Time Tracking Software.pdf
 
A Guideline to Zendesk to Re:amaze Data Migration
A Guideline to Zendesk to Re:amaze Data MigrationA Guideline to Zendesk to Re:amaze Data Migration
A Guideline to Zendesk to Re:amaze Data Migration
 
SQL Injection Introduction and Prevention
SQL Injection Introduction and PreventionSQL Injection Introduction and Prevention
SQL Injection Introduction and Prevention
 
INGKA DIGITAL: Linked Metadata by Design
INGKA DIGITAL: Linked Metadata by DesignINGKA DIGITAL: Linked Metadata by Design
INGKA DIGITAL: Linked Metadata by Design
 
AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...
AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...
AI/ML Infra Meetup | Improve Speed and GPU Utilization for Model Training & S...
 
Crafting the Perfect Measurement Sheet with PLM Integration
Crafting the Perfect Measurement Sheet with PLM IntegrationCrafting the Perfect Measurement Sheet with PLM Integration
Crafting the Perfect Measurement Sheet with PLM Integration
 
Entropy, Software Quality, and Innovation (presented at Princeton Plasma Phys...
Entropy, Software Quality, and Innovation (presented at Princeton Plasma Phys...Entropy, Software Quality, and Innovation (presented at Princeton Plasma Phys...
Entropy, Software Quality, and Innovation (presented at Princeton Plasma Phys...
 
How to pick right visual testing tool.pdf
How to pick right visual testing tool.pdfHow to pick right visual testing tool.pdf
How to pick right visual testing tool.pdf
 
Top Mobile App Development Companies 2024
Top Mobile App Development Companies 2024Top Mobile App Development Companies 2024
Top Mobile App Development Companies 2024
 
JustNaik Solution Deck (stage bus sector)
JustNaik Solution Deck (stage bus sector)JustNaik Solution Deck (stage bus sector)
JustNaik Solution Deck (stage bus sector)
 
AI/ML Infra Meetup | Perspective on Deep Learning Framework
AI/ML Infra Meetup | Perspective on Deep Learning FrameworkAI/ML Infra Meetup | Perspective on Deep Learning Framework
AI/ML Infra Meetup | Perspective on Deep Learning Framework
 
KLARNA - Language Models and Knowledge Graphs: A Systems Approach
KLARNA -  Language Models and Knowledge Graphs: A Systems ApproachKLARNA -  Language Models and Knowledge Graphs: A Systems Approach
KLARNA - Language Models and Knowledge Graphs: A Systems Approach
 
Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
 
AI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in MichelangeloAI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in Michelangelo
 
10 Essential Software Testing Tools You Need to Know About.pdf
10 Essential Software Testing Tools You Need to Know About.pdf10 Essential Software Testing Tools You Need to Know About.pdf
10 Essential Software Testing Tools You Need to Know About.pdf
 
AI Hackathon.pptx
AI                        Hackathon.pptxAI                        Hackathon.pptx
AI Hackathon.pptx
 
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAGAI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
 
What need to be mastered as AI-Powered Java Developers
What need to be mastered as AI-Powered Java DevelopersWhat need to be mastered as AI-Powered Java Developers
What need to be mastered as AI-Powered Java Developers
 

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

Editor's Notes

  1. Software Engineer at Pilot Flying J (headquartered in Knoxville, TN) – always looking
  2. Ever had a method that should return an abstraction, but there wasn’t a clear contract?
  3. Suppose we had the following definition?
  4. What are we trying to accomplish?