Какая разница между пространством имен и модулем в F #? - PullRequest
74 голосов
/ 28 апреля 2009

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

Спасибо

Dave

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

1 Ответ

86 голосов
/ 28 апреля 2009

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

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

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

(РЕДАКТИРОВАТЬ: Пространства имен также могут быть открыты аналогичным образом, но тот факт, что модули могут содержать значения и функции, делает открытие модуля более «интересным», так как вы можете получить значения и функции, например «cos», являясь именами. вы можете использовать напрямую, тогда как в других .Net языках вам, как правило, всегда приходится его квалифицировать, например, "Math.cos").

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

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

...