Яка різниця між простором імен та модулем у F #?


85

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

Дякую

Дейв

Редагувати: Дякую за відповідь Брайан. Це те, що я хотів знати. Тільки роз’яснення: чи можете ви також відкрити простір імен (подібно до C # за допомогою оператора)?


4
І ще одне зауваження: коли ви відкриваєте простір імен у F #, наприклад System, ви також отримуєте доступ до його підпросторів імен. Отже, у C #, якщо ви відкриваєте System, вам все одно потрібно написати "System.IO.File". У F # ви можете написати "IO.File". Я вважаю, що це робить код набагато приємнішим.
MichaelGG

Відповіді:


93

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

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

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

(РЕДАКТУВАТИ: Простори імен також можна відкрити подібним чином, але той факт, що модулі можуть містити значення та функції, робить відкриття модуля більш "цікавим", оскільки ви можете закінчити значеннями та функціями, наприклад "cos", будучи іменами, якими ви можете користуватися безпосередньо, тоді як в інших мовах .Net вам зазвичай завжди потрібно це кваліфікувати, наприклад, "Math.cos").

Якщо ви вводите код на "верхньому рівні" в F #, цей код неявно надходить у модуль.

Сподіваюся, це дещо допоможе, це досить відкрите питання. :)


Це не може бути цілком правильно. модулі існують і в С #, чи не так ?: stackoverflow.com/questions/645728/what-is-a-module-in-net
Олександр Берд

1
Ну, є netmodule, який є .NET-функцією, і є модуль F #, який є F #, і я думаю, що VB, можливо, має модульну конструкцію, а класи - це `` модулі '' в загальному сенсі програмної інженерії ... Але початкове питання стосувалося модулів F #.
Брайан,

1
Там відмінна посилання тут , що пояснює взаємозв'язок між вузлом і чистим модулем - один вузол може містити 2 netmodules написаних на 2 різних мовах.
Дарій

2
Нагадує "за допомогою статики" у C # 6
Бруно Гарсія,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.