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