Vagif Abilov Playing functional Conway’s game of life
About myself Mail: GitHub: object BitBucket: object Blog: Articles: The source code for this presentation can be found at
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
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.
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
What people say on Twitter “How is writing Java like writing classic Russian literature? You have to introduce 100 names before anything can
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
Checking other implementations Source: Conway-s-Game-of-Life-using-State-Pattern
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)
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?
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!
Imperative languages lessons Extra definitions may better clarify your intentions but may also lead to increased system complexity Names are opinionated, more names – more opinions More names – more constraints Design patterns are often introduced to patch up shortcomings in the language
Entering functional programming Conway’s game of life is about transforming cell generations What if we focus just on functional transformations?
Implementation plan 1.Classical game of life 2.Multidimensional game of life 3.Concurrent game of life 4.Game of life visualization 5.Something completely different
Classical game of life
Observation It’s possible to write clean code without class hierarchies
Multidimensional game of life
Observation You don’t need to revise your code to make it generic: with type inference it just happens to you
Asynchronous game of life
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
Asynchronous programming model Synchronous: –Execute (can be any verb, e.g. Read) Asynchronous: –BeginExecute (receives AsyncCallback, returns IAsyncResult) –EndExecute (receives IAsyncResult object) – method (receives IAsyncResult) File IO example: –Read –BeginRead, EndRead,
Benchmark results Pattern size*C# LinqF#F# AsyncF# PSeq 10**0: : : : : : : : : : : : : : : : * 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
Observation Immutable data structures make it trivial to execute parts of your code asynchronously or in parallel
Game of life visualization
Observation It’s simple to send your data to external components when data are exposed via primitive types
Time for surprises Something completely different Living with no sense of monad
Song time! Living With No Sense of Monads Originally performed by Smokie with slightly different words
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...
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.
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
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.
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...
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?!
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
Thank you! Mail: GitHub: object BitBucket: object Blog: Articles: The source code for this presentation can be found at