Quelle est la différence entre un espace de noms et un module en F #?

85

Je viens de commencer à apprendre F # (avec peu d'expérience préalable avec .NET) alors pardonnez-moi pour ce qui est probablement une question très simple: Quelle est la différence entre un espace de noms et un module en F #?

Merci

Dave

Edit: Merci pour la réponse Brian. C'est ce que je voulais savoir. Juste une clarification: pouvez-vous également ouvrir un espace de noms (similaire à l'instruction en utilisant C #)?

Dave Berk
la source
4
Et encore une note, lorsque vous ouvrez un espace de noms en F #, comme System, vous avez également accès à ses sous-espaces de noms. Donc, en C #, si vous ouvrez System, vous devez toujours écrire "System.IO.File". En F #, vous pouvez écrire "IO.File". Je trouve que cela rend le code beaucoup plus agréable.
MichaelGG

Réponses:

93

Un espace de noms est une chose .Net, commune dans de nombreux langages de puissance industrielle, juste un moyen d'organiser les cadres et d'éviter les conflits de noms entre différentes bibliothèques. Vous et moi pouvons définir un type "Foo" et les utiliser tous les deux dans un projet, à condition qu'ils soient dans des espaces de noms différents (par exemple NS1.Foo et NS2.Foo). Les espaces de noms dans .Net contiennent des types.

Un module est une chose F #, il est à peu près analogue à une "classe statique" ... c'est une entité qui peut contenir des valeurs et des fonctions liées à let, ainsi que des types (notez que les espaces de noms ne peuvent pas contenir directement des valeurs / fonctions, des espaces de noms ne peut contenir que des types, qui eux-mêmes peuvent contenir des valeurs et des fonctions). Les choses à l'intérieur d'un module peuvent être référencées via "ModuleName.Thing", qui est la même syntaxe que pour les espaces de noms, mais les modules en F # peuvent également être 'ouverts' pour permettre un accès non qualifié, par exemple

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

(EDIT: Les espaces de noms peuvent également être ouverts de la même manière, mais le fait que les modules peuvent contenir des valeurs et des fonctions rend l'ouverture d'un module plus `` intéressante '', en ce sens que vous pouvez vous retrouver avec des valeurs et des fonctions, par exemple "cos", étant des noms que vous pouvez utiliser directement, alors que dans d'autres langages .Net, vous devez généralement le qualifier, par exemple "Math.cos").

Si vous tapez du code au «niveau supérieur» en F #, ce code va implicitement dans un module.

J'espère que cela aide un peu, c'est une question assez ouverte. :)

Brian
la source
Cela ne peut pas être entièrement correct. les modules existent également en C #, n'est-ce pas?: stackoverflow.com/questions/645728/what-is-a-module-in-net
Alexander Bird
1
Eh bien, il y a un module réseau, qui est une chose .NET, et il y a un module F #, qui est une chose F #, et je pense que VB a peut-être une construction de module, et les classes sont des `` modules '' au sens général du génie logiciel ... Mais la question initiale concernait les modules F #.
Brian
1
Il y a un excellent lien ici , qui explique la relation entre un assembly et un module net - un seul assembly pourrait contenir 2 netmodules écrits dans 2 langues différentes.
Darius le
2
Ressemble à l'utilisation de statique en C # 6
Bruno Garcia