Adventures in F# - Enums and constructors
Going over the F# Pluralsight course I learned a few more things and thought I should use them to improve my world-famous Rock-Paper-Too-Long-To-Type game.
New tidbits and improvements in the game
new keyword is only required when the type implements IDisposable. So no need to use them on my RPSLS object. It works exactly the same.
default constructor can be defined such as
new() = Car("red", 3)
You can access the constructor parameters anywhere in the object so there is no need to assign it to another value.
Assigning values to enum values makes it compatible with other.NET languages. When I assigned values to moves an interesting thing happened. I stated getting this error: Enumerations cannot have members So you can overload operators in a discriminated union in F# and you can use it in F# only but if you want your type be compatible with other CLR languages than you can only use it as a regular enum.
After I assigned the values my Move discriminated union became:
type Move = | Rock = 0 | Spock = 1 | Paper = 2 | Lizard = 3 | Scissors = 4
So no more overloaded minus operator which significantly reduced the lines of code in the type. After Googling a bit I found out that generally the above values are assigned to moves the winner is determined by extracting computer number from the player number and applying modulo operator. For example: When player plays rock (0) and computer plays paper (2)
difference = player - computer = 0 - 2 = -2 result = -2 % 5 = 3 --> Python returns 3 after this operation if result < 3 then player wins if result >= 3 then computer wins
Apparently in F#, -2 % 5 = -2! So I had to add 5 before applying modulo operator:
let diff = ((int)(this.PlayerMoves.Item(i) - ComputerMoves.Item(i)) + 5) % 5
I’m still working with the PluralSight course. In the next post I’ll examine type casting, abstract types and do bindings etc