F# in action: playing functional Conway's game of life
John Conway's game of life has become a playground for programmers using different languages and platforms. It inspired many coding dojos and code retreats because it touches various aspects of development from component design to performance testing.
In this session we are going to take functional approach and play different variations of Conway's game of life using F#. The session starts with presentation of a traditional game implementation in C#, so we can later compare it with F# versions. Switching to F#, we will first write an implementation for a standard two-dimensional board, and then extend it to support asynchronous workflows, parallel tasks and even boards of arbitrary dimensions. Each implementation will be complemented with a set of tests using FsUnit framework, and graphical presentation of results will use Microsoft Chart Controls.
2. About myself
• Mail: vagif.abilov@gmail.com
• Twitter: @ooobject
• GitHub: object
• BitBucket: object
• Blog: http://bloggingabout.net/blogs/vagif/default.aspx
• Articles: http://www.codeproject.com
The source code for this presentation can be found at
https://github.com/object/ConwayGame
4. Conway’s game of life
• Invented in 1970 by the British mathematician John
Conway
• Zero-player game, its evolution is fully determined by its
initial state
• The universe of the Game of Life is an infinite two-
dimensional orthogonal grid of square cells, each of
which is in one of two possible states, alive or dead
Source: Wikipedia
5. Rules of Conway’s game of life
1. Any live cell with fewer than two live neighbours dies,
as if caused by under-population.
2. Any live cell with two or three live neighbours lives on
to the next generation.
3. Any live cell with more than three live neighbours dies,
as if by overcrowding.
4. Any dead cell with exactly three live neighbours
becomes a live cell, as if by reproduction.
6. Impelemening Conway’s game
How would you approach the implementation?
A small quiz: what names should we introduce?
• Classes
• Class properties
• Class methods
• Structs
• Enums
7. What people say on Twitter
“How is writing Java like writing classic
Russian literature? You have to introduce
100 names before anything can happen.”
@jamesiry
8. Speaking about Russian literature
Nightingales, a sigh, a whisper
In a shady nook
And the lullaby in silver
Of a lazy brook.
…
• A short poem by Afanasy Fet (1850)
• 12 lines, not a single verb
10. Implementation code metrics
• 5 classes (including 2 subclasses)
• 5 properties
• 5 methods
• 316 lines of code
• 64 effective lines of code (calculated using VS code
metrics)
11. Cell state definition
Discussion in comments about cell state definition
• Class (base class with 2 subclasses implementing
State pattern)
• Enum (Dead, Alive)
• Boolean
What would you choose?
12. Cell state choice consequence
• No matter what type you choose to represent cell state,
you will need a cell property to hold it
• Having cells with different property values (Dead and
Alive) encourages design where both types of cells are
stored
• Storing cells with different states has negative impact
on the scalability
• Moreover: it limits the solution to boards of fixed size
• Adding names add constraints!
13. Imperative languages lessons
• Symbol definition does not necessarily lead to clean
code
• Names are opinionated, more names – more opinions
• More names – more constraints
• Design patterns are often introduced to patch up
shortcomings in the language
14. Entering functional programming
Conway’s game of life is about
transforming cell generations
What if we focus just on
functional transformations?
15. Implementation plan
1. Classical game of life
2. Multidimensional game of life
3. Concurrent game of life
4. Game of life visualization
5. Surprise, surprise…
19. Asynchronous burden
• Asynchronous support requires revision of API and its
implementation
• It is common to offer two (significantly different)
versions of API: one for synchronous and one for
asynchronous execution
• Mutable nature of imperative languages require major
changes if not complete rewrite of components to
become thread-safe and support asynchronous or
parallel execution
21. Benchmark results
Pattern size* C# Linq F# F# Async F# PSeq
10** 0:00.183 0:00.357 0:00.320 0:00.570
25 0:00.428 0:00.315 0:00.157 0:00.196
50 0:06.034 0:04.064 0:01.512 0:01.231
100 1:25.162 1:06.429 0:27.428 0:31.270
* Pattern size N corresponds to a square N * N used to
generate a pattern of N * N / 2 elements
** Pattern size 10 was used to warm up the text fixture
24. Life in a tweet
• A great algorithm should fit in a tweet
• If an algorithm does not fit in a tweet, it’s
overcomplicated
• But to fit a great algorithm in a tweet you need a great
programming language
• F# is a great programming language!
25. Life in a tweet
let f s g = g|>List.mapi(fun i x->match Seq.sumBy(fun o->
g.[abs((i+o)%(s*s))])[-1-s;-s;1-s;-1;1;-1+s;s;1+s]with 3->
1|2->x|_->0)
• Written by Phil Trelfold
(http://trelford.com/blog/post/140.aspx)
• 127 characters long
26. Song time!
Living With No Sense of Monads
Originally performed by Smokie
with slightly different words
27. Living with no sense of monads
I first met Alice in a small bookstore,
"What book, - I asked, - are you looking for?"
And she said: "About monads."
I understood that's a key to her heart,
I had no doubts that I was smart.
It should be easy reading, an easy start...
28. Living with no sense of monads
But I still don't get this wisdom,
It's really mystic word
I guess it has it's reasons,
Someone gets it, but I don't.
'Cos for twenty-four years
I've been trying to understand the monads.
29. Living with no sense of monads
Twenty-four years
Just waiting for a chance,
I have to keep on reading,
Maybe get a second glance,
I will never get used to not understanding sense
of monads
30. Living with no sense of monads
Grew up together,
Went to the same class,
And to be honest:
I was better in math
Than Alice.
31. Living with no sense of monads
Too old for rock-n-roll - I'm forty four,
Too young for monads - still have a hope.
That the day will come
When I let Alice know...
32. Living with no sense of monads
But I still don't get this wisdom,
It's really mystic word
I guess it has it's reasons,
Someone gets it, but I don't.
'Cos for twenty-four years
I've been trying to understand the monads.
(all together):
Monads! What the f*ck is monads?!
33. Living with no sense of monads
Twenty-four years
Just waiting for a chance,
I have to keep on reading,
Maybe get a second glance,
I will never get used to not understanding sense
of monads
34. Thank you!
• Mail: vagif.abilov@gmail.com
• Twitter: @ooobject
• GitHub: object
• BitBucket: object
• Blog: http://bloggingabout.net/blogs/vagif/default.aspx
• Articles: http://www.codeproject.com
The source code for this presentation can be found at
https://github.com/object/ConwayGame
Notas del editor
Popular choice: code retreats, coding dojos, pair programmingNext: job interview, define some names
Next: Russian literature
Next: implementation from CodeProject
Next: how would you define State property?
Why state pattern and not enumerators?“Enumerators are amateurish”Next: consequences and constraints