Parámetros de tipo resueltos estáticamente (F#)
Un parámetro de tipo resuelto estáticamente es un parámetro de tipo que se reemplaza con un tipo real en tiempo de compilación y no en tiempo de ejecución. Va precedido por el símbolo de intercalación (^).
ˆtype-parameter
Comentarios
En el lenguaje F#, hay dos clases de parámetros de tipo. En primer lugar está el parámetro de tipo genérico estándar. Estos parámetros se indican mediante un apóstrofo ('), como en 'T y 'U. Equivalen a los parámetros de tipo genérico de otros lenguajes .NET Framework. El otro tipo de parámetro se resuelve estáticamente y se indica mediante el símbolo de intercalación, como en ^T y ^U.
Los parámetros de tipo resueltos estáticamente son sobre todo útiles cuando se usan con restricciones de miembro, que son restricciones que permiten especificar que un argumento de tipo debe tener uno o varios miembros determinados. Este tipo de restricción no se puede crear mediante un parámetro de tipo genérico normal.
En la siguiente tabla, se resumen las similitudes y las diferencias entre las dos clases de parámetros de tipo.
Característica |
Genérico |
Se resuelve estáticamente |
---|---|---|
Sintaxis |
'T, 'U |
^T, ^U |
Tiempo de resolución |
Tiempo de ejecución |
Tiempo de compilación |
Restricciones de miembro |
No se puede utilizar con restricciones de miembro. |
Se puede utilizar con restricciones de miembro. |
Generación de código |
Un tipo o método con parámetros de tipo genérico estándar da lugar a la generación de un solo tipo o método genérico. |
Se generan varias instancias de los tipos y métodos, una por cada tipo que se necesita. |
Uso con tipos |
Se puede utilizar con tipos. |
No se puede utilizar con tipos. |
Uso con funciones inline |
No. Una función inline no puede tener un parámetro de tipo genérico estándar. |
Sí. Los parámetros de tipo resueltos estáticamente no se pueden utilizar con funciones o métodos que no sean inline. |
Muchas funciones de la biblioteca básica de F#, sobre todo los operadores, tienen parámetros de tipo que se resuelven estáticamente. Se trata de funciones y operadores inline, que dan lugar a una generación de código eficaz para los cálculos numéricos.
Los métodos y funciones inline que usan operadores u otras funciones que utilicen parámetros de tipo resueltos estáticamente, también pueden emplear ellos mismos este tipo de parámetro. En muchas ocasiones, durante la inferencia de tipos, se deduce que esas funciones inline tienen parámetros de tipo que se resuelven estáticamente. En el siguiente ejemplo, se muestra una definición de operador para la cual se deduce que tiene un parámetro de tipo que se resuelve estáticamente.
let inline (+@) x y = x + x * y
// Call that uses int.
printfn "%d" (1 +@ 1)
// Call that uses float.
printfn "%f" (1.0 +@ 0.5)
El tipo resuelto de (+@) se basa en el uso de (+) y (*), que hacen que mediante la inferencia de tipos se deduzcan las restricciones de miembro en los parámetros de tipo estáticamente resueltos. Tal y como se muestra en el intérprete de F#, el tipo resuelto es el siguiente.
^a -> ^c -> ^d
when (^a or ^b) : (static member (+) : ^a * ^b -> ^d) and
(^a or ^c) : (static member (+) : ^a & ^c -> ^b)
La salida es la siguiente.
2
1.500000