Pourquoi F # Core définit-il des types de tableaux génériques?


11

Je viens de remarquer que l'espace de noms FSharp.Core comprend des types de tableaux génériques allant jusqu'à 4 dimensions, à savoir Core. [] <'T> , Core. [,] <' T>, etc. C # et VB semblent bien fonctionner avec System.Array - bien qu'il ne soit pas clair pour moi comment ils parviennent à prendre en charge les types de tableaux spécialisés fortement typés comme int [], string [].

Je suppose que cela devient alors deux questions:

  • Comment C # prend-il en charge les types de tableaux spécialisés fortement typés comme int [] basés sur le System.Array non générique?
  • Étant donné que C # parvient à le faire, pourquoi F # définit-il des types de tableaux génériques?

Réponses:


8

F # ne définit pas les types de tableaux génériques en soi. Les tableaux en F # sont le même type de tableau que le reste de .NET, et malgré toutes les preuves syntaxiques indiquant le contraire, ils ne sont pas génériques.

Cela peut parfois se retourner contre vous lorsque vous utilisez la réflexion en F # - même si vous en avez un array<int>qui semble être un type générique parfaitement valide, lorsque vous l'inspectez, vous obtenez un faux de IsGenericType, un vrai de IsArrayet vous obtenez l'argument type avec GetElementTypeplutôt alors GetGenericArguments.

Comme Telastyn l'a noté dans sa réponse, il s'agit probablement du bagage hérité de .NET 1.0 avec lequel nous devrons vivre. Mais ce n'est qu'une des nombreuses choses qui font de l'utilisation de l'API de réflexion en F # un véritable champ de mines.

Ce que F # définit, ce sont les [], [,] ...abréviations / alias / opérateurs de type et les modules avec les fonctions correspondantes, mais ils se réfèrent tous finalement au même type de tableau ci-dessous.

Vous pouvez consulter le code source sur github ici et ici pour le voir par vous-même.


Mais ceux-ci sont répertoriés comme des types réels, pas des alias de type. Je suis confus parce que msdn.microsoft.com/en-us/library/dd233214.aspx dit "Le type de tous les tableaux F # est le tableau de type .NET Framework", mais alors quelle est la relation entre System.Array et FSharp .Core tableaux génériques?
Asik

Il n'y a pas de tableaux génériques;) Ils peuvent être de vrais types techniquement, et c'est pourquoi le générateur de doc msdn les a choisis, mais tout ce qu'ils définissent, c'est comment le compilateur doit les développer, si je les lis correctement (le premier fichier que j'ai lié) et quelques méthodes d'extension dans le deuxième fichier. C'est tout ce qu'on peut en dire. Créez-en un et appelez GetType dessus. Ce sera un type de tableau spécialisé basé sur System.Array.
scrwtp

Ou plutôt, les types statiques eux-mêmes sont génériques, mais pas le type de tableau d'exécution qu'ils encapsulent. Peut-être que l'implémentation de l'inférence de type est légèrement plus facile de cette façon, mais c'est une supposition sauvage.
scrwtp

5

Comment C # prend-il en charge les types de tableaux spécialisés fortement typés comme int [] basés sur le System.Array non générique?

Très probablement, en générant une classe spécialisée qui hérite de System.Arraypuisque les génériques n'étaient pas disponibles en 1.0. Le comportement a probablement été conservé pour des raisons de compatibilité.

Étant donné que C # parvient à le faire, pourquoi F # définit-il des types de tableaux génériques?

Parce que F # n'avait pas les mêmes contraintes de compatibilité que C # 2.0 avec le code existant. D'après ce que je sais, C # 2.0 aurait eu des types de tableaux génériques s'il s'agissait de la première version de C #.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.