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 F#, existem dois tipos distintos de parâmetros de tipo. O primeiro tipo é o parâmetro de tipo genérico padrão. Essas sã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 as restrições de membro, são restrições permitem que você especifique um argumento de tipo deve ter um determinado membro ou membros para serem usados. 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 instanciações 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 resolvidos não podem ser usados em funções ou métodos que não estejam embutidos.

Muitos F# biblioteca funções principais, especialmente os operadores, estaticamente resolveu os parâmetros de tipo. Essas funções e operadores são embutidas e resultam na geração de código eficientes para cálculos numéricos.

Inline métodos e funções que usam operadores ou usam outras funções que resolveram estaticamente parâmetros de tipo, também podem usar os parâmetros de tipo estaticamente resolvido propriamente ditos. Freqüentemente, a inferência de tipo infere tais funções embutidas para estaticamente resolveu os parâmetros de tipo. O exemplo a seguir ilustra uma definição de operador é 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 (*), ambos de inferência de tipo que causa inferir membro restrições 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

Consulte também

Referência

Genéricos (F#)

Inferência de tipo (F#)

Restrições (F#)

Funções embutidas (F#)

Outros recursos

Generalização automática (F#)