Uno spazio dei nomi è una cosa .Net, comune in molti linguaggi industriali, solo un modo per organizzare i framework ed evitare conflitti di denominazione tra le diverse librerie. Sia tu che io possiamo definire un tipo "Foo" e usarli entrambi in un progetto, a condizione che siano in spazi dei nomi diversi (ad esempio NS1.Foo e NS2.Foo). Gli spazi dei nomi in .Net contengono tipi.
Un moduloèuna cosa in F #, è grosso modo analogo a una "classe statica" ...èun'entità che può contenere valori e funzioni let-bound, così come tipi (nota che gli spazi dei nomi non possono contenere direttamente valori / funzioni, spazi dei nomi può contenere solo tipi, che a loro volta possono contenere valori e funzioni). È possibile fare riferimento alle cose all'interno di un modulo tramite "ModuleName.Thing", che è la stessa sintassi dei namespace, ma i moduli in F # possono anche essere 'aperti' per consentire un accesso non qualificato, ad es.
open ModuleName
...
Thing // rather than ModuleName.Thing
(MODIFICA: anche gli spazi dei nomi possono essere aperti in modo simile, ma il fatto che i moduli possano contenere valori e funzioni rende l'apertura di un modulo più 'interessante', in quanto puoi concludere con valori e funzioni, ad esempio "cos", essendo nomi che puoi usare direttamente, mentre in altri linguaggi .Net dovresti sempre qualificarlo, ad esempio "Math.cos").
Se digiti il codice al "livello superiore" in F #, questo codice va implicitamente in un modulo.
Spero che questo aiuti in qualche modo, è una domanda piuttosto aperta. :)