I’m too tired to write a proper blog post about this but I managed to port DonSyme’s Game of Life Demo that comes with the F# Distribution to Silverlight. It’s not a full port as there were some UI events that I couldn’t get to work for love nor money – I think these maybe bugs in Silverlight itself. However the game does look pretty cool. Also Silverlight currently has no way to marshal back to the UI thread which makes multithreading a bit difficult.

The game was relatively simple to port, in fact I kept the first few files, “alg.fsi”, “alg.fs” and “worker.fs” in tacked and just replaced the client.fs with the following:



namespace SilverLife


open System;

open System.Collections.Generic;

open System.Windows.Browser;

open System.Threading;

open System.Windows

open System.Windows.Controls

open System.Windows.Documents

open System.Windows.Ink

open System.Windows.Input

open System.Windows.Media

open System.Windows.Media.Animation

open System.Windows.Shapes


type Page() = class

    inherit Canvas() as base

    member x.Page_Loaded(o : obj,  e : EventArgs) =

        let canvas = o :?> Canvas

        let gridSize = 23


        /// Create and configure the worker automata, ready to be placed

        /// onto a thread.

        let rec worker = Worker.mkWorker gridSize


        and grid =

            [| for x in 0 .. gridSize ->

                [| for y in 0 .. gridSize ->

                    let image = new Image()

                    image.Source <- new Uri("RedBloodcellOff.jpg", UriKind.Relative)

                    image.SetValue(Canvas.TopProperty, y * 14)

                    image.SetValue(Canvas.LeftProperty, x * 14)


                    image |] |]


        and bornQueue = new Queue<Game.points>() 

        and diedQueue = new Queue<Game.points>() 


        // This is the refresh operation that will be invoked by the worker.

        and workerNotifyUpdates (born,died) =

            lock bornQueue (fun () -> bornQueue.Enqueue(born))

            lock diedQueue (fun () -> diedQueue.Enqueue(died))




        and workerThread = new Thread(start=(fun () -> worker.Start()), IsBackground = true, Priority = ThreadPriority.Lowest)



        let dequeueAll (queue : Queue<Game.points>) image =

            while (queue.Count > 0) do

                let points = queue.Dequeue()

                List.iter (fun (x,y) -> grid.[x].[y].Source <- new Uri(image, UriKind.Relative) ) points


        let timer_Tick _ =

            lock bornQueue (fun () -> dequeueAll bornQueue "RedBloodcellOn.jpg")

            lock diedQueue (fun () -> dequeueAll diedQueue "RedBloodcellOff.jpg")


        let timer = new HtmlTimer()

        timer.Interval <- 1


        timer.Enabled <- true




    member x.ClickSquare(sender : obj,  e : MouseEventArgs) = ()


You can see the game at the following URL (careful I’ve noticed it crashes the browser sometimes, I guess that’s what they mean by “alpha”):


Of course you need the silverlight 1.1 alpha installed here’s a screen shot for those that don’t have that.


Feedback was imported from my only blog engine, it’s no longer possible to post feedback here.

Silverlight Cream for May 25 - http://geekswithblogs.net/wynapsetechnicalmusings/archive/2007/05/25/112762.aspx

Silverlight Cream for May 25

Game of Life in Silverlight and F# - http://blogs.msdn.com/dsyme/archive/2007/05/25/game-of-life-in-silverlight-and-f.aspx

Game of Life in Silverlight and F#

Game of Life in Silverlight and F# - http://blogs.msdn.com/walterst/archive/2007/05/27/game-of-life-in-silverlight-and-f.aspx

Game of Life in Silverlight and F#

re: Game of Life in Silverlight and F# - Richard Hein

Great stuff, I wanted to put F# and Silverlight together as well. I am looking into how to best combine this with Monorail. Cheers, Richard Hein

re: Game of Life in Silverlight and F# - Robert Pickering

Hi Richard,

Thanks for the feedback. You maybe insterested in this more detailed post I’ve just written:

I’ve not actually had chance to play with the monorail stuff but I’m looking forward to see what you come up with.


Silverlight Examples - Michael’s Blog

During the weekend I spent some minutes to collect some of the greatest Silverlight examples. Most of

Non-Stop Mix 07 Paris - Richard J. Rothery Jr.


Nice one F# and Silverlight!
Your are an Englishman a Paris…
I am and Amercican a Marseille…

See you at Mix 07 in Paris if you are planning to attend.

Best Regards,

【转】分享数十个silverlight示例和blog - Bryan Chow


re: Game of Life in Silverlight and F# - Sridhar Ratnakumar

I tried my best to compile, but even though I have Silverlight latest version installed I get this error -

C:\Users\srid>fsc -I “C:\Program Files\Microsoft Silverlight\2.0.30523.6” -r System.SilverLight.dll -r agclr.dll -r Microsoft.Scripting.Vestigial.dll -r System.
dll -r Microsoft.Scripting.Silverlight.dll -r Microsoft.Scripting.dll –clr-root “C:\Program Files\Microsoft Silverlight” –no-framework –no-mllib –static-lin
k fslib test.fs
Implicitly referencing ‘C:\Program Files\Microsoft Silverlight\2.0.30523.6\System.dll’…

startup(1,0): error FS0191: Unable to find the file System.SilverLight.dll in any of
C:\Program Files\Microsoft Silverlight
C:\Program Files\Microsoft Silverlight\2.0.30523.6
C:\Program Files\FSharp-\bin.

re: Game of Life in Silverlight and F# - Ray

Pretty interesting. Though, there is little to no use of F# in this example as code pretty much imperative - about just same as if it was wrote in C#…

re: Game of Life in Silverlight and F# - Robert Pickering

Hi Ray,

I agree the layer that interacts with silverlight is pretty imperative, mainly because its a UI layer, which is the sample code presented in this blog. However layers that actually drive the simulation, which come from the F# example pack are good functional style. These were distributed with F# but now need to be downloaded from: