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