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

85

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

Благодарность

Дэйв

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

Дэйв Берк
источник
4
И еще одно замечание: когда вы открываете пространство имен в F #, например System, вы также получаете доступ к его подпространствам имен. Итак, в C #, если вы откроете систему, вам все равно нужно будет написать «System.IO.File». В F # вы можете написать «IO.File». Я считаю, что это делает код намного приятнее.
MichaelGG

Ответы:

93

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

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

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

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

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

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

Брайан
источник
Это не может быть полностью правильным. модули существуют и в C #, не так ли ?: stackoverflow.com/questions/645728/what-is-a-module-in-net
Александр Берд
1
Ну, есть сетевой модуль, который является вещью .NET, и есть модуль F #, который является частью F #, и я думаю, что VB может иметь модульную конструкцию, а классы - это `` модули '' в общем смысле разработки программного обеспечения ... Но исходный вопрос был о модулях F #.
Брайан
1
Там отличная ссылка здесь , что объясняет взаимосвязь между узлом и чистым модулем - один узел может содержать 2 netmodules написанных на 2 разных языках.
Дариус
2
Похоже на 'using static' в C # 6
Бруно Гарсия