34
Vagif Abilov Playing functional Conway’s game of life

F# in Action: Playing Functional Conway's Game of Life

Embed Size (px)

DESCRIPTION

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.

Citation preview

Page 1: F# in Action: Playing Functional Conway's Game of Life

Vagif Abilov

Playing functionalConway’s game of life

Page 2: F# in Action: Playing Functional Conway's Game of Life

About myself

• Mail: [email protected]• 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

Page 3: F# in Action: Playing Functional Conway's Game of Life

Vagif Abilov

Playing functionalConway’s game of life

Page 4: F# in Action: Playing Functional Conway's Game of Life

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

Page 5: F# in Action: Playing Functional Conway's Game of Life

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.

Page 6: F# in Action: Playing Functional Conway's Game of Life

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

Page 7: F# in Action: Playing Functional Conway's Game of Life

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

Page 8: F# in Action: Playing Functional Conway's Game of Life

Speaking about Russian literature

Nightingales, a sigh, a whisperIn a shady nookAnd the lullaby in silverOf a lazy brook.…

• A short poem by Afanasy Fet (1850)• 12 lines, not a single verb

Page 9: F# in Action: Playing Functional Conway's Game of Life

Checking other implementations

Source:http://www.codeproject.com/Articles/185208/Solving-Conway-s-Game-of-Life-using-State-Pattern

Page 10: F# in Action: Playing Functional Conway's Game of Life

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)

Page 11: F# in Action: Playing Functional Conway's Game of Life

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?

Page 12: F# in Action: Playing Functional Conway's Game of Life

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!

Page 13: F# in Action: Playing Functional Conway's Game of Life

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

Page 14: F# in Action: Playing Functional Conway's Game of Life

Entering functional programming

Conway’s game of life is about transforming cell generations

What if we focus just on functional transformations?

Page 15: F# in Action: Playing Functional Conway's Game of Life

Implementation plan

1. Classical game of life2. Multidimensional game of life3. Concurrent game of life4. Game of life visualization5. Surprise, surprise…

Page 16: F# in Action: Playing Functional Conway's Game of Life

Classical game of life

Page 17: F# in Action: Playing Functional Conway's Game of Life

Multidimensional game of life

Page 18: F# in Action: Playing Functional Conway's Game of Life

Asynchronous game of life

Page 19: F# in Action: Playing Functional Conway's 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

Page 20: F# in Action: Playing Functional Conway's Game of Life

Asynchronous programming model

• Synchronous: – Execute (can be any verb, e.g. Read)

• Asynchronous:– BeginExecute (receives AsyncCallback, returns IAsyncResult)– EndExecute (receives IAsyncResult object)– <Callback> method (receives IAsyncResult)

• File IO example:– Read– BeginRead, EndRead, <Callback>

Page 21: F# in Action: Playing Functional Conway's Game of Life

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

Page 22: F# in Action: Playing Functional Conway's Game of Life

Game of life visualization

Page 23: F# in Action: Playing Functional Conway's Game of Life

Time for surprises

Life in a tweet

Living with no sense of monad

Page 24: F# in Action: Playing Functional Conway's Game of Life

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!

Page 25: F# in Action: Playing Functional Conway's Game of Life

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

Page 26: F# in Action: Playing Functional Conway's Game of Life

Song time!

Living With No Sense of Monads

Originally performed by Smokie with slightly different words

Page 27: F# in Action: Playing Functional Conway's Game of Life

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...

Page 28: F# in Action: Playing Functional Conway's Game of Life

Living with no sense of monads

But I still don't get this wisdom,It's really mystic wordI guess it has it's reasons,Someone gets it, but I don't.'Cos for twenty-four yearsI've been trying to understand the monads.

Page 29: F# in Action: Playing Functional Conway's Game of Life

Living with no sense of monads

Twenty-four yearsJust 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

Page 30: F# in Action: Playing Functional Conway's Game of Life

Living with no sense of monads

Grew up together,Went to the same class,And to be honest:I was better in mathThan Alice.

Page 31: F# in Action: Playing Functional Conway's Game of Life

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...

Page 32: F# in Action: Playing Functional Conway's Game of Life

Living with no sense of monads

But I still don't get this wisdom,It's really mystic wordI guess it has it's reasons,Someone gets it, but I don't.'Cos for twenty-four yearsI've been trying to understand the monads.

(all together):Monads! What the f*ck is monads?!

Page 33: F# in Action: Playing Functional Conway's Game of Life

Living with no sense of monads

Twenty-four yearsJust 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

Page 34: F# in Action: Playing Functional Conway's Game of Life

Thank you!

• Mail: [email protected]• 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