Was ist der Unterschied zwischen einem Namespace und einem Modul in F #?

85

Ich habe gerade angefangen, F # zu lernen (mit wenig Erfahrung mit .NET). Verzeihen Sie mir also die wahrscheinlich sehr einfache Frage: Was ist der Unterschied zwischen einem Namespace und einem Modul in F #?

Vielen Dank

Dave

Edit: Danke für die Antwort Brian. Das wollte ich wissen. Nur eine Klarstellung: Können Sie auch einen Namespace öffnen (ähnlich wie bei C # using-Anweisung)?

Dave Berk
quelle
4
Und noch ein Hinweis: Wenn Sie einen Namespace in F # wie System öffnen, erhalten Sie auch Zugriff auf seine Sub-Namespaces. Wenn Sie also in C # System öffnen, müssen Sie noch "System.IO.File" schreiben. In F # können Sie "IO.File" schreiben. Ich finde, das macht Code viel schöner.
MichaelGG

Antworten:

91

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

Brian
quelle
Das kann nicht ganz richtig sein. Module gibt es auch in C #, nicht wahr
Alexander Bird
1
Nun, es gibt ein Netzmodul, das eine .NET-Sache ist, und es gibt ein F # -Modul, das eine F # -Sache ist, und ich denke, VB hat vielleicht ein Modulkonstrukt, und Klassen sind 'Module' im allgemeinen Sinne der Softwareentwicklung ... Die ursprüngliche Frage betraf jedoch F # -Module.
Brian
1
Es gibt einen großen Link hier , die die Beziehung zwischen einer Anordnung und einem Netto-Modul erklärt - eine einzige Baugruppe 2 netmodules in 2 verschiedenen Sprachen geschrieben enthalten könnte.
Darius
2
Ähnelt "mit statischen" in C # 6
Bruno Garcia