Ich habe ein Problem darin, den genauen Unterschied zwischen Modulen und Namespaces in F # zu verstehen und wenn ich das eine oder andere verwende. Nun, beide werden in Betracht gezogen, um Code einzubinden und eine Hierarchie zu definieren, um unsere Projekte gut zu organisieren.
Module haben viele Eigenschaften: Sie können Werte, Typen aller Art enthalten und diese Elemente können auch in public
, protected
oder internal
definiert werden.
Aber, wenn Module verwendet werden?
Ich habe auch verstanden, dass Module schließlich als Klassen in MSIL (Intermediate Language) abgebildet werden. Also ein Modul ist eine Klasse, ist ein Typ .... Die Größe meiner Zweifel verbessert sich ....
Bei Verwendung von Modulen ??? Sind sie nützlich?
D. Syme argumentiert auch, dass Module erweiterbar sind, also nehme ich an, dass sie unter diesem Gesichtspunkt wie Namensräume sind.
Ich kann den Grund nicht verstehen, sie zu benutzen.
Danke
Ein großer Unterschied:
.Net-Namespaces können keine Werte (Definitionen zulassen) enthalten, während Module dies können.
In der IL / Bytecode-Ebene wird ein Modul in eine .net-Klasse kompiliert, nicht in einen .net-Namespace.
Wann werden Module verwendet?
Für eine kleine und spezifische Aufgabe folgen F # und andere FPs normalerweise dem Muster der Bottom-Up-Programmierung: Sie zerlegen Ihre Aufgabe in eine Reihe kleiner Funktionen und gruppieren diese Funktionen dann zu einem Modul.
Die Antwort ist, dass es so natürlich ist, ein Modul zu verwenden, um einen Satz verwandter Funktionen und anderer F # -Werte und Typen zusammenzufassen.
Während ein Namespace verwendet wird, um größere Dinge zu gruppieren: z.B. alle Klassen für Matrixoperationen.
Modul ist keine statische Klasse (im C # -Sinn) Module können spezielle F # -Werte enthalten, z.B. Curry-Funktionen; während eine statische Klasse nicht kann.
Wie Yin Zhu sagt, können Module Werte enthalten. Und Sie können Module wie Namespaces öffnen. Diese zwei Eigenschaften zusammen sind warum in F # können Sie Dinge wie
tun %Vor%während man in einer Sprache wie C # immer etwas sagen müsste wie
%Vor% und verwenden Sie einen qualifizierten Namen ( SomeClass.Method
) und nicht nur einen Namen ( letBoundFunction
). So können Sie Module verwenden, wenn Sie wollen, dass Leute Ihr Modul Foo
öffnen können und bar
aufrufen, indem Sie einfach bar
anstatt Foo.bar
überall angeben. (Dies ist besonders nützlich für Operatoren, zB wenn Sie eine Menge von benutzerdefinierten Operatoren (wie +++
oder whatnot) in einer Bibliothek definieren, indem Sie sie in ein Modul einfügen, können die Leute das Modul öffnen und dann zB% verwenden co_de% anstatt sperriger Sachen wie x +++ y
oder was auch immer.)
Beachten Sie, dass F # Code standardmäßig in eine .fs-Datei in einem Modul (mit dem Namen der Datei) einfügt, dies jedoch ändern kann, indem der erste Code in der Datei eine Namespace-Deklaration ist, z. B.
%Vor%oder indem Sie Ihr eigenes Modul deklarieren
%Vor%am Anfang der Datei.
Tags und Links .net namespaces f# module