Un espacio de nombres es una cosa .Net, común en muchos lenguajes industriales, solo una forma de organizar marcos y evitar conflictos de nombres entre diferentes bibliotecas. Tanto tú como yo podemos definir un tipo "Foo" y usarlos en un proyecto, siempre que estén en espacios de nombres diferentes (por ejemplo, NS1.Foo y NS2.Foo). Los espacios de nombres en .Net contienen tipos.
Un módulo es una cosa de F #, es aproximadamente análoga a una "clase estática" ... es una entidad que puede contener valores y funciones ligados a let, así como tipos (tenga en cuenta que los espacios de nombres no pueden contener directamente valores / funciones, espacios de nombres solo puede contener tipos, que a su vez pueden contener valores y funciones). Se puede hacer referencia a las cosas dentro de un módulo a través de "ModuleName.Thing", que es la misma sintaxis que para los espacios de nombres, pero los módulos en F # también se pueden 'abrir' para permitir el acceso no calificado, por ejemplo
open ModuleName
...
Thing // rather than ModuleName.Thing
(EDITAR: los espacios de nombres también se pueden abrir de manera similar, pero el hecho de que los módulos pueden contener valores y funciones hace que abrir un módulo sea más 'interesante', ya que puede terminar con valores y funciones, por ejemplo, "cos", que son nombres que puede usar directamente, mientras que en otros lenguajes .Net normalmente siempre tendrá que calificarlo, por ejemplo, "Math.cos").
Si escribe código en 'el nivel superior' en F #, este código va implícitamente en un módulo.
Espero que eso ayude un poco, es una pregunta bastante abierta. :)