Ein Namespace ist eine .NET-Sache, die in vielen industriellen Sprachen üblich ist. Sie dient lediglich dazu, Frameworks zu organisieren und Namenskonflikte zwischen verschiedenen Bibliotheken zu vermeiden. Sowohl Sie als auch ich können einen Typ "Foo" definieren und beide in einem Projekt verwenden, sofern sie sich in unterschiedlichen Namespaces befinden (z. B. NS1.Foo und NS2.Foo). Namespaces in .Net enthalten Typen.
Ein Modul ist ein F # -Ding, es ist ungefähr analog zu einer "statischen Klasse" ... es ist eine Entität, die let-gebundene Werte und Funktionen sowie Typen enthalten kann (beachten Sie, dass Namespaces Werte / Funktionen, Namespaces nicht direkt enthalten können kann nur Typen enthalten, die selbst Werte und Funktionen enthalten können). Dinge innerhalb eines Moduls können über "ModuleName.Thing" referenziert werden. Dies ist die gleiche Syntax wie für Namespaces. Module in F # können jedoch auch "geöffnet" werden, um einen uneingeschränkten Zugriff zu ermöglichen, z
open ModuleName
...
Thing // rather than ModuleName.Thing
(BEARBEITEN: Namespaces können ebenfalls auf ähnliche Weise geöffnet werden. Die Tatsache, dass Module Werte und Funktionen enthalten können, macht das Öffnen eines Moduls jedoch interessanter, da Sie Werte und Funktionen, z. B. "cos", als Namen verwenden können direkt, während Sie es in anderen .NET-Sprachen normalerweise immer qualifizieren müssen, z. B. "Math.cos").
Wenn Sie in F # Code auf der obersten Ebene eingeben, wird dieser Code implizit in ein Modul eingefügt.
Hoffe das hilft etwas, es ist eine ziemlich offene Frage. :) :)