Какая разница между пространством имен и модулем в F #?

Я только начал изучать F # (с небольшим опытом работы с .NET), поэтому простите меня за то, что, вероятно, очень простой вопрос: Какая разница между пространством имен и модулем в F #?

Спасибо

Dave

Редактировать: Спасибо за ответ Брайан. Это то, что я хотел знать. Просто пояснение: можете ли вы также открыть пространство имен (аналогично оператору, использующему С#)?

Ответ 1

Пространство имен - это .Net вещь, распространенная на многих языках промышленной прочности, просто способ организации фреймворков и избежание конфликтов имен между различными библиотеками. Мы с вами можем определить тип "Foo" и использовать их как в проекте, при условии, что они находятся в разных пространствах имен (например, NS1.Foo и NS2.Foo). Пространства имен в .Net содержат типы.

Модуль - это предмет F #, он примерно аналогичен "статическому классу"... это объект, который может хранить значения и функции, связанные с привязкой, а также типы (обратите внимание, что пространства имен не могут напрямую содержать значения/функции, пространства имен могут содержать только типы, которые сами могут содержать значения и функции). Вещи внутри модуля можно ссылаться через "ModuleName.Thing", который является тем же синтаксисом, что и для пространств имен, но модули в F # также могут быть "открыты", чтобы обеспечить неквалифицированный доступ, например.

open ModuleName
...
Thing  // rather than ModuleName.Thing

(EDIT: Пространства имен также могут быть открыты, но тот факт, что модули могут содержать значения и функции, делает открытие модуля более "интересным", поскольку вы можете использовать значения и функции, например, "cos", будучи именами вы можете использовать напрямую, в то время как на других языках .Net, как правило, всегда необходимо их квалифицировать, например, "Math.cos" ).

Если вы вводите код на "верхнем уровне" в F #, этот код неявно входит в модуль.

Надеюсь, что это помогает, это довольно открытый вопрос.:)