Przestrzeń nazw jest zjawiskiem .Net, powszechnym w wielu językach o dużej sile przemysłowej, po prostu sposobem organizowania struktur i unikania konfliktów nazw między różnymi bibliotekami. Zarówno Ty, jak i ja możemy zdefiniować typ "Foo" i używać ich zarówno w projekcie, pod warunkiem, że są w różnych przestrzeniach nazw (np. NS1.Foo i NS2.Foo). Przestrzenie nazw w .Net zawierają typy.
Moduł jest rzeczą F #, jest w przybliżeniu analogiczny do "klasy statycznej" ... jest to jednostka, która może przechowywać wartości i funkcje związane z let-bound, a także typy (pamiętaj, że przestrzenie nazw nie mogą bezpośrednio zawierać wartości/functions, namespace mogą zawierać tylko typy, które same mogą zawierać wartości i funkcje). Do rzeczy wewnątrz modułu można się odwoływać za pomocą "ModuleName.Thing", która jest tą samą składnią co dla przestrzeni nazw, ale moduły w F # mogą być również "otwarte", aby umożliwić niewykwalifikowany dostęp, np.
open ModuleName
...
Thing // rather than ModuleName.Thing
(EDIT: Przestrzenie nazw mogą podobnie być otwarty, ale fakt, że moduły mogą zawierać wartości i funkcji sprawia, otwierając moduł bardziej „interesujące”, w które można skończyć z wartościami i funkcjami, na przykład „cos ", to nazwy, których możesz używać bezpośrednio, podczas gdy w innych językach .Net zwykle musisz je zakwalifikować, np." Math.cos ").
Jeśli wpiszesz kod na "najwyższym poziomie" w F #, ten kod niejawnie trafi do modułu.
Nadzieję, że nieco pomaga, to dość otwarte pytanie. :)
I jeszcze jedna uwaga, gdy otworzysz przestrzeń nazw w F #, podobnie jak System, otrzymasz również dostęp do jej przestrzeni nazw podrzędnych. Tak więc w C#, jeśli otworzysz System, nadal musisz napisać "System.IO.File". W F # można wpisać "IO.File". Uważam, że czyni to kod znacznie ładniejszym. – MichaelGG