Qual é a diferença entre um namespace e um módulo em F #?

86

Acabei de começar a aprender F # (com pouca experiência anterior com .NET), então me perdoe pelo que provavelmente é uma pergunta muito simples: Qual a diferença entre um namespace e um módulo em F #?

obrigado

Dave

Edit: Obrigado pela resposta Brian. Isso é o que eu queria saber. Apenas um esclarecimento: você também pode abrir um namespace (semelhante ao C # using a instrução)?

Dave Berk
fonte
4
E mais uma observação, quando você abre um namespace em F #, como System, você obtém acesso a seus sub namespaces também. Portanto, em C #, se você abrir System, ainda precisará escrever "System.IO.File". Em F #, você pode escrever "IO.File". Acho que isso torna o código muito mais agradável.
MichaelGG

Respostas:

94

Um namespace é uma coisa .Net, comum em muitas linguagens de força industrial, apenas uma maneira de organizar frameworks e evitar conflitos de nomenclatura entre diferentes bibliotecas. Você e eu podemos definir um tipo "Foo" e usá-los em um projeto, desde que estejam em namespaces diferentes (por exemplo, NS1.Foo e NS2.Foo). Os namespaces em .Net contêm tipos.

Um módulo é uma coisa F #, é quase análogo a uma "classe estática" ... é uma entidade que pode conter valores e funções de limite permitido, bem como tipos (observe que os namespaces não podem conter diretamente valores / funções, namespaces pode conter apenas tipos, que podem conter valores e funções). Coisas dentro de um módulo podem ser referenciadas por meio de "ModuleName.Thing", que é a mesma sintaxe dos namespaces, mas os módulos em F # também podem ser 'abertos' para permitir acesso não qualificado, por exemplo,

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

(EDIT: Namespaces também podem ser abertos de forma semelhante, mas o fato de que os módulos podem conter valores e funções torna a abertura de um módulo mais 'interessante', pois você pode acabar com valores e funções, por exemplo, "cos", sendo nomes que você pode usar diretamente, enquanto em outras linguagens .Net você normalmente sempre terá que qualificá-lo, por exemplo, "Math.cos").

Se você digitar o código 'no nível superior' em F #, esse código entrará implicitamente em um módulo.

Espero que ajude um pouco, é uma questão bastante aberta. :)

Brian
fonte
Isso não pode ser totalmente correto. módulos também existem em C #, não existem ?: stackoverflow.com/questions/645728/what-is-a-module-in-net
Alexander Bird
1
Bem, há um módulo de rede, que é uma coisa .NET, e há um módulo F #, que é uma coisa F #, e acho que o VB talvez tenha uma construção de módulo e classes são 'módulos' no sentido geral de engenharia de software ... Mas a pergunta original era sobre os módulos F #.
Brian
1
Há um ótimo link aqui , que explica a relação entre um assembly e um módulo de rede - um único assembly pode conter 2 módulos de rede escritos em 2 linguagens diferentes.
Darius
2
Assemelha-se a 'usando estática' em C # 6
Bruno Garcia