Resolvido estaticamente os parâmetros de tipo (F#)
A resolvido estaticamente o parâmetro de tipo é um parâmetro de tipo é substituído com um tipo real em tempo de compilação em vez de em tempo de execução.Elas são precedidas por um símbolo de circunflexo (^).
ˆtype-parameter
Comentários
Na linguagem do F#, existem dois tipos distintos de parâmetros de tipo.O primeiro tipo é o parâmetro de tipo genérico padrão.Essas serão indicadas por um apóstrofo ('), como em 'T e 'U.Eles são equivalentes aos parâmetros de tipo genérico em outros.Idiomas do NET Framework.O outro tipo é estaticamente resolvido e é indicado por um símbolo de interpolação, como em ^T e ^U.
Parâmetros de tipo estaticamente resolvidos são úteis principalmente em conjunto com restrições de membro, que são restrições que permitem que você especifique um argumento de tipo deve ter um determinado membro ou membros para ser usado.Não há nenhuma maneira de criar esse tipo de restrição usando um parâmetro de tipo genérico regular.
A tabela a seguir resume as semelhanças e diferenças entre os dois tipos de parâmetros de tipo.
Característica |
Genérico |
Resolvido estaticamente |
---|---|---|
Sintaxe |
'T, 'U |
^T, ^U |
Tempo de resolução |
Tempo de execução |
Tempo de compilação |
Restrições de membro |
Não pode ser usado com restrições de membro. |
Pode ser usado com restrições de membro. |
Geração de código |
Um tipo (ou método) com parâmetros de tipo genérico padrão resulta na geração de um único tipo genérico ou método. |
Várias instâncias de tipos e métodos são geradas, uma para cada tipo que for necessária. |
Use com tipos |
Pode ser usado em tipos. |
Não pode ser usado em tipos. |
Use com funções embutidas |
Não.Uma função in-line não pode ser parametrizada com um parâmetro de tipo genérico padrão. |
Sim.Parâmetros de tipo estaticamente resolvido não podem ser usados em funções ou métodos que não estão embutidos. |
Muitos F# biblioteca funções principais, especialmente os operadores, resolveu estaticamente parâmetros de tipo.Essas funções e operadores são in-line e resultam na geração de código eficientes para cálculos numéricos.
Métodos in-line e funções que usam operadores ou outras funções que resolveram estaticamente parâmetros de tipo, também podem usar parâmetros de tipo estaticamente resolvido propriamente ditos.Em geral, a inferência de tipo infere tais funções embutidas para estaticamente resolveram parâmetros de tipo.O exemplo a seguir ilustra uma definição de operador que é inferida para ter um parâmetro de tipo estaticamente resolvido.
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)
O tipo resolvido de (+@) baseia-se no uso de ambos (+) e (*), tanto do que fazer com que a inferência de tipo inferir restrições de membro sobre os parâmetros de tipo estaticamente resolvido.O tipo de resolvido, como mostra o interpretador de F#, é o seguinte.
^a -> ^c -> ^d
when (^a or ^b) : (static member (+) : ^a * ^b -> ^d) and
(^a or ^c) : (static member (+) : ^a & ^c -> ^b)
A saída é da seguinte maneira.
2
1.500000