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