Por que o F # Core define tipos de matriz genéricos?


11

Acabei de notar que o espaço para nome FSharp.Core inclui tipos de matriz genéricos de até 4 dimensões, como Core. [] <'T> , Core. [,] <' T>, etc. C # e VB parecem estar indo muito bem com System.Array - embora não esteja claro para mim como eles conseguem oferecer suporte a tipos de array especializados fortemente tipados como int [], string [].

Eu acho que isso se torna duas perguntas então:

  • Como o C # suporta tipos de matriz especializados fortemente tipados como int [] baseados no System.Array não genérico?
  • Dado que o C # consegue fazer isso, por que o F # define tipos de matriz genéricos?

Respostas:


8

O F # não define tipos de matriz genéricos por si só. Matrizes em F # são o mesmo tipo de matriz que o restante do .NET usa e, apesar de todas as evidências sintáticas apontando o contrário, elas não são genéricas.

Às vezes, isso pode sair pela culatra quando você usa reflexo em F # - mesmo se você tiver um array<int>que parece ser um tipo genérico perfeitamente válido, quando você o inspeciona, obtém um falso de IsGenericType, um verdadeiro de IsArraye o argumento de tipo com GetElementTypebastante então GetGenericArguments.

Como Telastyn observou em sua resposta, essa é provavelmente a bagagem herdada do .NET 1.0 com a qual teremos que conviver. Mas é apenas uma das muitas coisas que tornam o uso da API de reflexão no F # um verdadeiro campo minado.

O que o F # define são as [], [,] ...abreviações / aliases / operadores de tipo e módulos com funções correspondentes, mas todos eles se referem ao mesmo tipo de matriz abaixo.

Você pode olhar o código fonte no github aqui e aqui para ver por si mesmo.


Mas eles são listados como tipos reais, não como aliases de tipo. Estou confuso porque msdn.microsoft.com/en-us/library/dd233214.aspx diz "O tipo de todas as matrizes F # é o .NET Framework tipo Array", mas qual é a relação entre System.Array e FSharp .Core matrizes genéricas?
Asik

Não existem matrizes genéricas;) Eles podem ser tipos reais tecnicamente, e é por isso que o msdn doc generator os selecionou, mas tudo o que eles definem é como o compilador deve expandi-los, se eu ler corretamente (o primeiro arquivo que eu vinculei) , e alguns métodos de extensão no segundo arquivo. É tudo o que há para isso. Crie um desses e chame GetType nele. Será um tipo de matriz especializado baseado em System.Array.
scrwtp

Ou melhor, os próprios tipos estáticos são genéricos, mas o tipo de matriz de tempo de execução que eles estão agrupando não é. Talvez implementar a inferência de tipo seja um pouco mais fácil, mas esse é um palpite.
21420 scrubtp

5

Como o C # suporta tipos de matriz especializados fortemente tipados como int [] baseados no System.Array não genérico?

Muito provavelmente, gerando uma classe especializada que herda System.Arraydesde que os genéricos não estavam disponíveis na 1.0. O comportamento provavelmente foi mantido para compatibilidade.

Dado que o C # consegue fazer isso, por que o F # define tipos de matriz genéricos?

Porque o F # não tinha as mesmas restrições de compatibilidade que o C # 2.0 tinha com o código existente. Com base no que eu sei, o C # 2.0 teria tipos de matriz genéricos se fosse o primeiro lançamento do C #.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.