2009-04-27 16 views
64

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

Dzięki

Dave

EDIT: Dzięki za odpowiedź Brian. Właśnie to chciałem wiedzieć. Po prostu wyjaśnienie: czy można również otworzyć przestrzeń nazw (podobnie jak przy użyciu instrukcji C#)?

+3

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

Odpowiedz

78

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. :)

+0

To nie może być w pełni poprawne. moduły istnieją również w języku C#, czyż nie ?: http://stackoverflow.com/questions/645728/what-is-a-module-in-net –

+1

Cóż, jest taki moduł, który jest rzeczą .NET, i jest moduł F #, który jest rzeczą F # i myślę, że VB może mieć konstrukcję modułową, a klasy są "modułami" w sensie inżynierii oprogramowania ogólnego ... Ale pierwotne pytanie dotyczyło modułów F #. – Brian

+1

Istnieje świetny link [tutaj] (http://blogs.msdn.com/b/junfeng/archive/2005/02/12/371683.aspx), który wyjaśnia związek między zespołem a modułem sieci - jednym Zgromadzenie może zawierać 2 moduły sieciowe napisane w 2 różnych językach. – Darius

Powiązane problemy