Jaka jest różnica między przestrzenią nazw a modułem w języku F #?

85

Właśnie zacząłem uczyć się języka F # (z niewielkim wcześniejszym doświadczeniem z .NET), więc wybacz mi prawdopodobnie bardzo proste pytanie: Jaka jest różnica między przestrzenią nazw a modułem w F #?

Dzięki

Dave

Edycja: Dzięki za odpowiedź Brian. To właśnie chciałem wiedzieć. Tylko wyjaśnienie: czy możesz również otworzyć przestrzeń nazw (podobnie do instrukcji C # using)?

Dave Berk
źródło
4
I jeszcze jedna uwaga, kiedy otwierasz przestrzeń nazw w F #, na przykład System, uzyskujesz również dostęp do jej podprzestrzeni nazw. Więc w C #, jeśli otworzysz System, nadal musisz napisać „System.IO.File”. W języku F # można napisać „IO.File”. Uważam, że dzięki temu kod jest znacznie ładniejszy.
MichaelGG

Odpowiedzi:

93

Przestrzeń nazw to rzecz .Net, powszechna w wielu językach o dużej sile przemysłowej, po prostu sposób na zorganizowanie ram i uniknięcie konfliktów nazw między różnymi bibliotekami. Zarówno ty, jak i ja możemy zdefiniować typ „Foo” i używać ich obu w projekcie, pod warunkiem, że znajdują się w różnych przestrzeniach nazw (np. NS1.Foo i NS2.Foo). Przestrzenie nazw w .Net zawierają typy.

Moduł jest czymś w języku F #, jest z grubsza analogiczny do "klasy statycznej" ... jest to jednostka, która może przechowywać wartości i funkcje związane z let, a także typy (zwróć uwagę, że przestrzenie nazw nie mogą bezpośrednio zawierać wartości / funkcji, przestrzeni nazw może zawierać tylko typy, które same mogą zawierać wartości i funkcje). Do elementów wewnątrz modułu można się odwoływać za pośrednictwem „ModuleName.Thing”, co ma taką samą składnię, jak w przypadku przestrzeni nazw, ale moduły w języku F # można również „otwierać”, aby umożliwić niekwalifikowany dostęp, np.

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

(EDYCJA: Przestrzenie nazw mogą być również otwierane w podobny sposób, ale fakt, że moduły mogą zawierać wartości i funkcje sprawia, że ​​otwieranie modułu jest bardziej „interesujące”, ponieważ można zakończyć z wartościami i funkcjami, np. „Cos”, będąc nazwami, których można użyć bezpośrednio, podczas gdy w innych językach .Net zwykle trzeba by to zakwalifikować, np. „Math.cos”).

Jeśli wpiszesz kod na „najwyższym poziomie” w języku F #, ten kod niejawnie przechodzi do modułu.

Mam nadzieję, że to trochę pomoże, ale to dość otwarte pytanie. :)

Brian
źródło
To nie może być w pełni poprawne. moduły istnieją również w C #, czyż nie ?: stackoverflow.com/questions/645728/what-is-a-module-in-net
Alexander Bird
1
Cóż, istnieje moduł sieciowy, który jest elementem .NET, i jest moduł F #, który jest elementem F #, i myślę, że VB może mieć konstrukcję modułową, a klasy są `` modułami '' w ogólnym sensie inżynierii oprogramowania ... Ale pierwotne pytanie dotyczyło modułów F #.
Brian,
1
Jest to świetny Link tutaj , co wyjaśnia zależność między zespołu oraz moduł netto - jeden zespół może zawierać 2 netmodules napisane w 2 różnych językach.
Darius,
2
Przypomina „używanie statyczne” w C # 6
Bruno Garcia