อะไรคือความแตกต่างระหว่างเนมสเปซและโมดูลใน F #?


87

ฉันเพิ่งเริ่มเรียนรู้ F # (โดยมีประสบการณ์เกี่ยวกับ. NET มาก่อนเล็กน้อย) ดังนั้นโปรดยกโทษให้ฉันสำหรับสิ่งที่อาจเป็นคำถามง่ายๆ: เนมสเปซและโมดูลใน F # แตกต่างกันอย่างไร

ขอบคุณ

เดฟ

แก้ไข: ขอบคุณสำหรับคำตอบ Brian นั่นคือสิ่งที่ฉันอยากรู้ แค่คำชี้แจง: คุณสามารถเปิดเนมสเปซได้เช่นกัน (คล้ายกับ C # โดยใช้คำสั่ง)?


5
และอีกหนึ่งข้อสังเกตเมื่อคุณเปิดเนมสเปซใน F # เช่น System คุณจะสามารถเข้าถึงเนมสเปซย่อยได้เช่นกัน ดังนั้นใน C # หากคุณเปิดระบบคุณยังต้องเขียน "System.IO.File" ใน F # คุณสามารถเขียน "IO.File" ฉันพบว่าสิ่งนี้ทำให้รหัสดีขึ้นมาก
MichaelGG

คำตอบ:


95

เนมสเปซเป็นสิ่งที่ใช้กันทั่วไปในภาษาที่มีความแข็งแกร่งทางอุตสาหกรรมหลายภาษาเป็นเพียงวิธีการจัดระเบียบเฟรมเวิร์กและหลีกเลี่ยงการตั้งชื่อที่ขัดแย้งกันระหว่างไลบรารีต่างๆ ทั้งคุณและฉันสามารถกำหนดประเภท "Foo" และใช้ทั้งสองอย่างในโปรเจ็กต์ได้หากอยู่ในเนมสเปซที่ต่างกัน (เช่น NS1.Foo และ NS2.Foo) Namespaces ใน. Net ประกอบด้วยประเภท

โมดูลเป็นสิ่งที่ F # ซึ่งคล้ายคลึงกับ "คลาสคงที่" โดยประมาณ ... เป็นเอนทิตีที่สามารถเก็บค่าและฟังก์ชันแบบ let-bound ตลอดจนประเภท (โปรดทราบว่าเนมสเปซไม่สามารถมีค่า / ฟังก์ชันเนมสเปซได้โดยตรง สามารถมีได้เฉพาะประเภทซึ่งสามารถมีค่าและฟังก์ชันได้) สิ่งต่างๆภายในโมดูลสามารถอ้างอิงได้ผ่านทาง "ModuleName.Thing" ซึ่งเป็นไวยากรณ์เดียวกับเนมสเปซ แต่โมดูลใน F # ยังสามารถ 'เปิด' เพื่อให้สามารถเข้าถึงได้อย่างไม่มีเงื่อนไขเช่น

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

(แก้ไข: Namespaces สามารถเปิดได้ในทำนองเดียวกัน แต่ความจริงที่ว่าโมดูลสามารถมีค่าและฟังก์ชันทำให้การเปิดโมดูลมีความ 'น่าสนใจ' มากขึ้นโดยที่คุณสามารถต่อท้ายด้วยค่าและฟังก์ชันต่างๆเช่น "cos" ซึ่งเป็นชื่อที่คุณสามารถใช้ได้ โดยตรงในขณะที่ภาษา. Net อื่น ๆ คุณมักจะต้องมีคุณสมบัติเช่น "Math.cos")

หากคุณพิมพ์รหัสที่ 'ระดับบนสุด' ใน F # รหัสนี้จะไปอยู่ในโมดูลโดยปริยาย

หวังว่าจะช่วยได้บ้างมันเป็นคำถามปลายเปิดที่ดี :)


ที่ไม่สามารถถูกต้องทั้งหมด มีโมดูลอยู่ใน C # ด้วยใช่หรือไม่: stackoverflow.com/questions/645728/what-is-a-module-in-net
Alexander Bird

1
มี netmodule ซึ่งเป็นสิ่งที่. NET และมีโมดูล F # ซึ่งเป็นสิ่งที่ F # และฉันคิดว่า VB อาจมีโครงสร้างโมดูลและคลาสเป็น 'โมดูล' ในความหมายทางวิศวกรรมซอฟต์แวร์ทั่วไป ... แต่คำถามเดิมเกี่ยวกับโมดูล F #
Brian

1
มีลิงค์ที่ยอดเยี่ยมที่นี่ซึ่งจะอธิบายความสัมพันธ์ระหว่างแอสเซมบลีและโมดูลเน็ต - แอสเซมบลีเดียวอาจมีเน็ตโมดู 2 ตัวที่เขียนใน 2 ภาษา
Darius

2
คล้ายกับ 'ใช้แบบคงที่' ใน C # 6
Bruno Garcia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.