Um namespace é uma coisa .Net, comum em muitas linguagens de força industrial, apenas uma maneira de organizar frameworks e evitar conflitos de nomenclatura entre diferentes bibliotecas. Você e eu podemos definir um tipo "Foo" e usá-los em um projeto, desde que estejam em namespaces diferentes (por exemplo, NS1.Foo e NS2.Foo). Os namespaces em .Net contêm tipos.
Um módulo é uma coisa F #, é quase análogo a uma "classe estática" ... é uma entidade que pode conter valores e funções de limite permitido, bem como tipos (observe que os namespaces não podem conter diretamente valores / funções, namespaces pode conter apenas tipos, que podem conter valores e funções). Coisas dentro de um módulo podem ser referenciadas por meio de "ModuleName.Thing", que é a mesma sintaxe dos namespaces, mas os módulos em F # também podem ser 'abertos' para permitir acesso não qualificado, por exemplo,
open ModuleName
...
Thing // rather than ModuleName.Thing
(EDIT: Namespaces também podem ser abertos de forma semelhante, mas o fato de que os módulos podem conter valores e funções torna a abertura de um módulo mais 'interessante', pois você pode acabar com valores e funções, por exemplo, "cos", sendo nomes que você pode usar diretamente, enquanto em outras linguagens .Net você normalmente sempre terá que qualificá-lo, por exemplo, "Math.cos").
Se você digitar o código 'no nível superior' em F #, esse código entrará implicitamente em um módulo.
Espero que ajude um pouco, é uma questão bastante aberta. :)