Bir ad alanı, endüstriyel güçteki birçok dilde yaygın olan, sadece çerçeveleri düzenlemenin ve farklı kütüphaneler arasındaki ad çatışmalarını önlemenin bir yoludur. Hem siz hem de ben bir tür "Foo" tanımlayabilir ve farklı ad alanlarında olmaları koşuluyla (örneğin NS1.Foo ve NS2.Foo) her ikisini de bir projede kullanabiliriz. .Net'teki ad alanları türleri içerir.
Bir modül F # bir şeydir, kabaca "statik sınıfa" benzerdir ... izin verilen değerleri ve işlevleri ve türleri tutabilen bir varlıktır (ad alanlarının doğrudan değerleri / işlevleri, ad alanlarını içeremeyeceğini unutmayın. yalnızca değerleri ve işlevleri içerebilen türleri içerebilir). Bir modül içindeki şeylere, ad alanlarıyla aynı sözdizimi olan "ModuleName.Thing" aracılığıyla başvurulabilir, ancak F # içindeki modüller, niteliksiz erişime izin vermek için 'açılabilir', örn.
open ModuleName
...
Thing // rather than ModuleName.Thing
(DÜZENLEME: Ad alanları da benzer şekilde açılabilir, ancak modüllerin değerler ve işlevler içerebilmesi gerçeği, bir modül açmayı daha 'ilginç' hale getirir, çünkü kullanabileceğiniz adlar olan "cos" gibi değerler ve işlevlerle sonuçlanabilir doğrudan, diğer .Net dillerinde genellikle her zaman nitelemeniz gerekir, örneğin "Math.cos").
F # 'da' en üst düzeyde 'kod yazarsanız, bu kod örtük olarak bir modüle girer.
Umarım bu biraz yardımcı olur, oldukça açık uçlu bir soru. :)