F # 'da bir ad alanı ile bir modül arasındaki fark nedir?


86

Daha yeni F # öğrenmeye başladım (.NET ile çok az deneyimim var), bu yüzden muhtemelen çok basit bir soru için beni affedin: Bir isim alanı ile F #'daki bir modül arasındaki fark nedir?

Teşekkürler

Dave

Düzenleme: Cevap Brian için teşekkürler. Bilmek istediğim buydu. Sadece bir açıklama: Bir ad alanını da açabilir misiniz (C # kullanan ifadeye benzer)?


4
Ve bir not daha, System gibi F # 'da bir ad alanı açtığınızda, onun alt ad alanlarına da erişebilirsiniz. Yani C # 'da System'i açarsanız, yine de "System.IO.File" yazmanız gerekir. F # 'da "IO.File" yazabilirsiniz. Bunun kodu çok daha güzel yaptığını görüyorum.
MichaelGG

Yanıtlar:


94

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


Bu tam olarak doğru olamaz. modüller C # olarak da var, değil mi?: stackoverflow.com/questions/645728/what-is-a-module-in-net
Alexander Bird

1
Bir .NET olayı olan bir netmodule var ve F # olan bir F # modülü var ve sanırım VB'nin bir modül yapısı var ve sınıflar genel yazılım mühendisliği anlamında 'modüller' ... Ancak asıl soru F # modülleri hakkındaydı.
Brian

1
Burada , bir montaj ve bir ağ modülü arasındaki ilişkiyi açıklayan harika bir bağlantı var - tek bir montaj, 2 farklı dilde yazılmış 2 ağ modülü içerebilir.
Darius

2
C # 6'daki 'statik kullanımı' andırıyor
Bruno Garcia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.