Parametri di tipo risolti staticamente (F#)
Un parametro di tipo risolto in modo statico è un parametro di tipo sostituito da un tipo effettivo in fase di compilazione anziché al runtime. Viene preceduto da un simbolo punto di inserimento (^).
ˆtype-parameter
Note
Nel linguaggio F# esistono due tipi distinti di parametri di tipo. Il primo tipo è il parametro standard di tipo generico, indicato con un apostrofo ('), come in 'T e 'U. Questo tipo equivale al parametro di tipo generico in altri linguaggi di .NET Framework. L'altro tipo viene risolto in modo statico ed indicato con un simbolo punto di inserimento, come in ^T e ^U.
I parametri di tipo risolti in modo statico risultano principalmente utili insieme ai vincoli di membro, che consentono di specificare che un argomento di tipo debba disporre di uno o più membri particolari per poter essere utilizzato. Non è possibile in alcun modo creare questo tipo di vincolo tramite un parametro standard di tipo generico.
Nella tabella seguente vengono riepilogate le analogie e le differenze tra i due tipi di parametri di tipo.
Funzionalità |
Generico |
Risolto in modo statico |
---|---|---|
Sintassi |
'T, 'U |
^T, ^U |
Tempo di risoluzione |
Fase di esecuzione |
Fase di compilazione |
Vincoli di membro |
Non utilizzabile con vincoli di membro. |
Utilizzabile con vincoli di membro. |
Generazione del codice |
Un tipo (o metodo) con parametri standard di tipo generico comporta la creazione di un solo tipo o metodo generico. |
Vengono generate più istanze di tipi e metodi, una per ogni tipo necessario. |
Utilizzo con i tipi |
Utilizzabile con i tipi. |
Non utilizzabile con i tipi. |
Utilizzo con le funzioni inline |
No. Non è parametrizzare una funzione inline con un parametro standard di tipo generico. |
Sì. Non è possibile utilizzare parametri di tipo risolti in modo statico con funzioni o metodi non inline. |
Molte funzioni della libreria di base di F#, soprattutto gli operatori, dispongono di parametri di tipo risolti in modo statico. Tali funzioni e operatori sono inline e comportano la generazione di codice efficiente per calcoli numerici.
Anche i metodi e le funzioni inline che utilizzano operatori o funzioni con parametri di tipo risolti in modo statico possono utilizzare parametri di tipo risolti in modo statico. L'inferenza del tipo deduce spesso che tali funzioni inline dispongano di parametri di tipo risolti in modo statico. Nell'esempio seguente viene illustrata una definizione dell'operatore che si deduce disponga di un parametro di tipo risolto in modo statico.
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)
Il tipo risolto di (+@) è basato sull'utilizzo di (+) e (*). Entrambi fanno in modo che l'inferenza del tipo deduca i vincoli di membro nei parametri di tipo risolti in modo statico. Il tipo risolto, come mostrato nell'interprete F#, risulta nel modo indicato di seguito.
^a -> ^c -> ^d
when (^a or ^b) : (static member (+) : ^a * ^b -> ^d) and
(^a or ^c) : (static member (+) : ^a & ^c -> ^b)
L'output è indicato di seguito.
2
1.500000