¿Por qué F # Core define tipos de matriz genéricos?

11

Acabo de notar que el espacio de nombres FSharp.Core incluye tipos de matriz genéricos de hasta 4 dimensiones, es decir, Core. [] <'T> , Core. [,] <' T>, etc. C # y VB parecen estar funcionando bien con System.Array, aunque no está claro para mí cómo logran admitir tipos de matrices especializadas fuertemente tipadas como int [], string [].

Supongo que esto se convierte en dos preguntas:

  • ¿Cómo admite C # tipos de matriz especializados fuertemente tipados como int [] basados ​​en el sistema no genérico System.Array?
  • Dado que C # logra hacer esto, ¿por qué F # define tipos de matriz genéricos?
Asik
fuente

Respuestas:

8

F # no define tipos de matriz genéricos per se. Las matrices en F # son el mismo tipo de matriz que el resto de los usos de .NET, y a pesar de todas las pruebas sintácticas que apuntan a lo contrario, no son genéricas.

Esto a veces puede ser contraproducente cuando está usando la reflexión en F #, incluso si tiene un array<int>tipo genérico perfectamente válido, cuando lo inspecciona obtiene un falso de IsGenericType, un verdadero de IsArray, y obtiene el argumento de tipo con GetElementTypemás bien entonces GetGenericArguments.

Como señaló Telastyn en su respuesta, este es probablemente el equipaje heredado de .NET 1.0 con el que tendremos que vivir. Pero es solo una de las muchas cosas que hacen que el uso de la API de reflexión en F # sea un verdadero campo minado.

Lo que define F # son las [], [,] ...abreviaturas / alias / operadores de tipo y los módulos con las funciones correspondientes, pero todos se refieren en última instancia al mismo tipo de matriz que se encuentra debajo.

Puede ver el código fuente en github aquí y aquí para verlo usted mismo.

scrwtp
fuente
Pero estos se enumeran como tipos reales, no como alias de tipo. Estoy confundido porque msdn.microsoft.com/en-us/library/dd233214.aspx dice "El tipo de todos los arreglos F # es el tipo de matriz .NET Framework", pero entonces ¿cuál es la relación entre System.Array y FSharp? .Core matrices genéricas?
Asik
No hay matrices genéricas;) Pueden ser tipos reales técnicamente, y es por eso que msdn doc generator los recogió, pero todo lo que definen es cómo el compilador debería expandirlos, si lo leí correctamente (el primer archivo que vinculé) , y un par de métodos de extensión en el segundo archivo. Eso es todo al respecto. Cree uno de esos y llame a GetType en él. Será un tipo de matriz especializado basado en System.Array.
scrwtp
O más bien, los tipos estáticos en sí mismos son genéricos, pero el tipo de matriz de tiempo de ejecución que están envolviendo no lo es. Tal vez implementar la inferencia de tipos sea un poco más fácil de esa manera, pero eso es una suposición descabellada.
scrwtp
5

¿Cómo admite C # tipos de matriz especializados fuertemente tipados como int [] basados ​​en el sistema no genérico System.Array?

Muy probablemente, al generar una clase especializada que hereda System.Arrayya que los genéricos no estaban disponibles en 1.0. Es probable que el comportamiento se haya mantenido por compatibilidad.

Dado que C # logra hacer esto, ¿por qué F # define tipos de matriz genéricos?

Porque F # no tenía las mismas restricciones de compatibilidad que C # 2.0 tenía con el código existente. Según lo que sé, C # 2.0 habría tenido tipos de matriz genéricos si fuera la primera versión de C #.

Telastyn
fuente