F# - Modules

As per MSDN library, an F# module is a grouping of F# code constructs, such as types, values, function values, and code in do bindings. It is implemented as a common language runtime (CLR) class that has only static members.

Depending upon the situation whether the whole file is included in the module, there are two types of module declarations −

  • Top-level module declaration
  • Local module declaration

In a top-level module declaration the whole file is included in the module. In this case, the first declaration in the file is the module declaration. You do not have to indent declarations in a top-level module.

In a local module declaration, only the declarations that are indented under that module declaration are part of the module.


Syntax for module declaration is as follows −

// Top-level module declaration.
module [accessibility-modifier] [qualified-namespace.]module-name

// Local module declaration.
module [accessibility-modifier] module-name =

Please note that the accessibility-modifier can be one of the following − public, private, internal. The default is public.

The following examples will demonstrate the concepts −

Example 1

The module file Arithmetic.fs −

module Arithmetic
let add x y =
   x + y

let sub x y =
   x - y
let mult x y =
   x * y
let div x y =
   x / y

The program file main.fs −

// Fully qualify the function name.
open Arithmetic
let addRes = Arithmetic.add 25 9
let subRes = Arithmetic.sub 25 9
let multRes = Arithmetic.mult 25 9
let divRes = Arithmetic.div 25 9

printfn "%d" addRes
printfn "%d" subRes
printfn "%d" multRes
printfn "%d" divRes

When you compile and execute the program, it yields the following output −


Example 2

// Module1
module module1 =
   // Indent all program elements within modules that are declared with an equal sign.
   let value1 = 100
   let module1Function x =
      x + value1

// Module2
module module2 =
   let value2 = 200

   // Use a qualified name to access the function.
   // from module1.
   let module2Function x =
      x + (module1.module1Function value2)

let result = module1.module1Function 25
printfn "%d" result

let result2 = module2.module2Function 25
printfn "%d" result2

When you compile and execute the program, it yields the following output −