Пространство имен - это вещь .Net, обычная для многих промышленных языков, просто способ организовать фреймворки и избежать конфликтов имен между различными библиотеками. И вы, и я можем определить тип «Foo» и использовать их оба в проекте, при условии, что они находятся в разных пространствах имен (например, NS1.Foo и NS2.Foo). Пространства имен в .Net содержат типы.
Модуль - это элемент F #, он примерно аналогичен «статическому классу» ... это сущность, которая может содержать значения и функции, привязанные к let, а также типы (обратите внимание, что пространства имен не могут напрямую содержать значения / функции, пространства имен могут содержать только типы, которые сами могут содержать значения и функции). На вещи внутри модуля можно ссылаться через "ModuleName.Thing", который имеет тот же синтаксис, что и для пространств имен, но модули в F # также могут быть "открыты", чтобы обеспечить неквалифицированный доступ, например
open ModuleName
...
Thing // rather than ModuleName.Thing
(РЕДАКТИРОВАТЬ: пространства имен также могут быть открыты аналогичным образом, но тот факт, что модули могут содержать значения и функции, делает открытие модуля более «интересным», поскольку вы можете закончить со значениями и функциями, например, «cos», которые являются именами, которые вы можете использовать напрямую, тогда как в других языках .Net вам, как правило, всегда нужно уточнять его, например, "Math.cos").
Если вы вводите код на «верхнем уровне» в F #, этот код неявно входит в модуль.
Надеюсь, что это немного поможет, это довольно открытый вопрос. :)