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


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

спасибо

Дэйв

Edit: Спасибо за ответ Брайан. Вот что я хотел узнать. Просто уточнение: можете ли вы также открыть пространство имен (аналогично оператору c# using)?

1 69

1 ответ:

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

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

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

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

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

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