Compartilhar via


Parâmetros de tipo resolvidos estaticamente (F#)

Um parâmetro de tipo estaticamente resolvido é um parâmetro de tipo substituído por um tipo real em tempo de compilação, em vez de em tempo de execução. Eles são precedidos por um símbolo de acento circunflexo (^).

ˆtype-parameter

Comentários

Na linguagem F#, há dois tipos diferentes de parâmetros de tipo. O primeiro tipo é o parâmetro de tipo genérico padrão. Eles são indicados por um apóstrofo ('), como em 'T e em 'U. Eles são equivalentes aos parâmetros de tipo genérico em outras linguagens do .NET Framework. O outro tipo é estaticamente resolvido e indicado por um acento circunflexo, como em ^T e em ^U.

Os parâmetros de tipo estaticamente resolvidos são basicamente úteis em conjunto com restrições de membro, que são restrições que permitem que você especifique que um argumento de tipo deve ter um ou mais membros específicos para que possa ser usado. Não há nenhuma maneira de criar esse tipo de restrição usando um parâmetro de tipo genérico normal.

A tabela a seguir resume as semelhanças e as diferenças entre os dois tipos de parâmetros.

Recurso

Genérico

Estaticamente resolvido

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éricos padrão resultam na geração de um único método ou tipo genérico.

Várias instanciações de tipos e métodos são geradas, uma para cada tipo que é necessário.

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 embutida não pode ser parametrizada com um parâmetro de tipo genérico padrão.

Sim. Os parâmetros de tipo estaticamente resolvidos não podem ser usados em funções ou em métodos que não estejam embutidos.

Muitas funções de biblioteca principal de F#, especialmente operadores, possuem parâmetros de tipo resolvidos estaticamente. Esses operadores e função são embutidos e resultam na geração de código eficiente para cálculos numéricos.

Os métodos e funções embutidos que usam operadores ou outras funções que resolveram estaticamente os parâmetros de tipo, também podem usar os parâmetros de tipo estaticamente resolvidos. Geralmente, a inferência de tipo infere tais funções embutidas para ter parâmetros de tipo estaticamente resolvidos. 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 (+@) se baseia no uso de (+) e (*), ambos fazem com que a inferência de tipo infira restrições de membros em parâmetros de tipo estaticamente resolvidos. O tipo resolvido, conforme mostrado no interpretador F#, é como se segue.

^a -> ^c -> ^d
when (^a or ^b) : (static member (+) : ^a * ^b -> ^d) and
     (^a or ^c) : (static member (+) : ^a * ^c -> ^b)

A saída é a seguinte.

2
1.500000

Consulte também

Referência

Genéricos (F#)

Inferência de tipos (F#)

Restrições (F#)

Conceitos

Funções embutidas (F#)

Outros recursos

Generalização automática (F#)