เนมสเปซเป็นสิ่งที่ใช้กันทั่วไปในภาษาที่มีความแข็งแกร่งทางอุตสาหกรรมหลายภาษาเป็นเพียงวิธีการจัดระเบียบเฟรมเวิร์กและหลีกเลี่ยงการตั้งชื่อที่ขัดแย้งกันระหว่างไลบรารีต่างๆ ทั้งคุณและฉันสามารถกำหนดประเภท "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 # รหัสนี้จะไปอยู่ในโมดูลโดยปริยาย
หวังว่าจะช่วยได้บ้างมันเป็นคำถามปลายเปิดที่ดี :)