¿Cuál es la diferencia entre un espacio de nombres y un módulo en F #?

85

Acabo de comenzar a aprender F # (con poca experiencia previa con .NET) así que perdóname por lo que probablemente sea una pregunta muy simple: ¿Cuál es la diferencia entre un espacio de nombres y un módulo en F #?

Gracias

Dave

Editar: Gracias por la respuesta Brian. Eso es lo que quería saber. Solo una aclaración: ¿también puede abrir un espacio de nombres (similar a la declaración de uso de C #)?

Dave Berk
fuente
4
Y una nota más, cuando abre un espacio de nombres en F #, como Sistema, también obtiene acceso a sus subespacios de nombres. Entonces, en C #, si abre Sistema, aún necesita escribir "System.IO.File". En F #, puede escribir "IO.File". Encuentro que esto hace que el código sea mucho más agradable.
MichaelGG

Respuestas:

93

Un espacio de nombres es una cosa .Net, común en muchos lenguajes industriales, solo una forma de organizar marcos y evitar conflictos de nombres entre diferentes bibliotecas. Tanto tú como yo podemos definir un tipo "Foo" y usarlos en un proyecto, siempre que estén en espacios de nombres diferentes (por ejemplo, NS1.Foo y NS2.Foo). Los espacios de nombres en .Net contienen tipos.

Un módulo es una cosa de F #, es aproximadamente análoga a una "clase estática" ... es una entidad que puede contener valores y funciones ligados a let, así como tipos (tenga en cuenta que los espacios de nombres no pueden contener directamente valores / funciones, espacios de nombres solo puede contener tipos, que a su vez pueden contener valores y funciones). Se puede hacer referencia a las cosas dentro de un módulo a través de "ModuleName.Thing", que es la misma sintaxis que para los espacios de nombres, pero los módulos en F # también se pueden 'abrir' para permitir el acceso no calificado, por ejemplo

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

(EDITAR: los espacios de nombres también se pueden abrir de manera similar, pero el hecho de que los módulos pueden contener valores y funciones hace que abrir un módulo sea más 'interesante', ya que puede terminar con valores y funciones, por ejemplo, "cos", que son nombres que puede usar directamente, mientras que en otros lenguajes .Net normalmente siempre tendrá que calificarlo, por ejemplo, "Math.cos").

Si escribe código en 'el nivel superior' en F #, este código va implícitamente en un módulo.

Espero que eso ayude un poco, es una pregunta bastante abierta. :)

Brian
fuente
Eso no puede ser completamente correcto. los módulos también existen en C #, ¿no es así ?: stackoverflow.com/questions/645728/what-is-a-module-in-net
Alexander Bird
1
Bueno, hay un netmodule, que es una cosa .NET, y hay un módulo F #, que es una cosa F #, y creo que VB quizás tiene una construcción de módulo, y las clases son 'módulos' en el sentido general de ingeniería de software ... Pero la pregunta original era sobre los módulos de F #.
Brian
1
Hay un gran enlace aquí , lo que explica la relación entre un montaje y un módulo de red - un único conjunto podría contener 2 netmodules escritas en 2 idiomas diferentes.
Darius
2
Se asemeja a 'usar estática' en C # 6
Bruno García