A module definition looks like a simple definition except that it
is preceeded by the keyword module.
module ::= module [concrete] modid :: type = expr ;
The type is not necessary and it can be left out.
module ::= module [concrete] modid = expr ;
The concrete modifier plays the same role here as for records, i.e. you can
make the value of a module know instead of just its type.
module foo$bar = 42; module foo$baz = open System$Int use Int, (+) in struct { inc :: Int -> Int; inc x = x+1; dec :: Int -> Int; dec x = x-1; };
#include Prelude
open System$String use * in open System$List use * in open System$Bool use * in open System$Char use * in open System$Int use * in open System$Error use * in open System$IO use * in open System$Tuples use * in open System$HO use * in