Mark Pearl

In part one of this series I showed an example of encapsulation within a local definition. This is useful to know so that you are aware of the scope of value holders etc. but what I am more interested in is encapsulation with regards to generating useful F# code libraries in .Net, this is done by using Namespaces and Modules.

Lets have a look at some C# code first…

using System;
namespace EncapsulationNS
    public class EncapsulationCLS
        public static void TestMethod()

Pretty simple stuff… now the F# equivalent….

namespace EncapsulationNS
module EncapsulationMDL =
let TestFunction = 

Even easier… lets look at some specifics about F# namespaces…

Namespaces are open. meaning you can have multiple source files and assemblies can contribute to the same namespace. So, Namespaces are a great way to group modules together, so the question needs to be asked, what role do modules play. For me, the F# module is in many ways similar to the vb6 days of modules. In vb6 modules were separate files and simply allowed us to group certain methods together. I find it easier to visualize F# modules this way than to compare them to the C# classes. However that being said one is not restricted to one module per file – there is flexibility to have multiple modules in one code file however with my limited F# experience I would still recommend using the file as the standard level of separating modules as it is very easy to then find your way around a solution.

An important note about interop with F# and other .Net languages. I wrote a blog post a while back about a very basic F# to C# interop.

If I were to reference an F# library in a C# project (for instance ‘TestFunction’), in C# it would show this method as a static method call, meaning I would not have to instantiate an instance of the module.

blog comments powered by Disqus

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