Mark Pearl

I’m loving my expert F# book – today I thought I would give a post on using mutable records as covered in Chapter 4 of Expert F#.

So as they explain the simplest mutable data structures in F# are mutable records. The whole concept of things by default being immutable is a new one for me from my C# background. Anyhow… lets look at some C# code first.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MutableRecords
{
    public class DiscreteEventCounter
    {
        public int Total { get; set; }
        public int Positive { get; set; }
        public string Name { get; private set; }

        public DiscreteEventCounter(string name)
        {
            Name = name;
        }
    }

    class Program
    {
        private static void recordEvent(DiscreteEventCounter s, bool isPositive)
        {
            s.Total += 1;
            if (isPositive) s.Positive += 1;
        }

        private static void reportStatus (DiscreteEventCounter s)
        {
            Console.WriteLine("We have {0} {1} out of {2}", s.Positive, s.Name, s.Total);
        }


        static void Main(string[] args)
        {
            var longCounter = new DiscreteEventCounter("My Discrete Counter");
            recordEvent(longCounter, true);
            recordEvent(longCounter, true);
            reportStatus(longCounter);
            Console.ReadLine();
        }
    }
}

Quite simple, we have a class that has a few values. We instantiate an instance of the class and perform increments etc on the instance. Now lets look at an equivalent F# sample.

namespace EncapsulationNS
module Module1 =
open System

type DiscreteEventCounter =
    { 
        mutable Total : int
        mutable Positive : int
        Name : string
    }

let recordEvent (s: DiscreteEventCounter) isPositive =
    s.Total <- s.Total+1
    if isPositive then s.Positive <- s.Positive+1

let reportStatus (s: DiscreteEventCounter) =
    printfn "We have %d %s out of %d" s.Positive s.Name s.Total

let newCounter nm = 
    {
        Total = 0;
        Positive = 0;
        Name = nm
    }

//
// Using it...
//
let longCounter = newCounter "My Discrete Counter"
recordEvent longCounter (true)
recordEvent longCounter (true)
reportStatus longCounter
System.Console.ReadLine()

Notice in the type declaration of the DiscreteEventCounter we had to explicitly declare that the total and positive value holders were mutable.

And that’s it – a very simple example of mutable types.



blog comments powered by Disqus

Want to get my personal insights on what I learn as I learn it? Subscribe now!


/