Partilhar via


Inferência de tipo (F#)

Este tópico descreve como o compilador F# infere os tipos de valores, variáveis, parâmetros e valores de retorno.

Inferência em geral

A idéia de inferência de tipo é o que você não precisará especificar os tipos de construções de F#, exceto quando o compilador definitivamente não é possível deduzir o tipo. A omissão de informações de tipo explícito não significa que o F# é uma linguagem tipificada dinamicamente ou que os valores F# são rigidez digitado. F# é uma linguagem digitada estaticamente, o que significa que o compilador deduz um tipo exato para cada construção durante a compilação. Se não houver informações suficientes para que o compilador deduzir os tipos de cada construção, você deve fornecer informações adicionais do tipo, geralmente adicionando anotações de tipo explícito em algum lugar no código.

Inferência de tipos de retorno e parâmetro

Em uma lista de parâmetro, você não precisará especificar o tipo de cada parâmetro. E ainda, F# é uma linguagem de digitado estaticamente e, portanto, cada valor e a expressão tem um tipo definido no momento da compilação. Para esses tipos de não especificar explicitamente, o compilador infere o tipo com base no contexto. Se o tipo não é especificado, ele é inferido para ser genérico. Se o código usa um valor de forma inconsistente, de tal forma que há único não inferida tipo que satisfaça a todos os usos de um valor, que o compilador reporta um erro.

O tipo de retorno de uma função é determinado pelo tipo da última expressão na função.

Por exemplo, no código a seguir, os tipos de parâmetro a e b e o tipo de retorno são inferidos sejam int porque o literal 100 é do tipo int.

let f a b = a + b + 100

Você pode influenciar a inferência de tipos, alterando os literais. Se você fizer o 100 um uint32 , acrescentando o sufixo u, os tipos de a, b, e o valor de retorno são inferidos sejam uint32.

Você também pode influenciar inferência usando outras construções que implicam restrições de tipo, como, por exemplo, funções e métodos que funcionam com apenas um tipo específico.

Além disso, você pode aplicar as anotações de tipo explícito para função ou método parâmetros ou variáveis em expressões, como mostrado nos exemplos a seguir. Se ocorrerem conflitos entre diferentes restrições, ocorrer erros.

// Type annotations on a parameter.
let addu1 (x : uint32) y =
    x + y

// Type annotations on an expression.
let addu2 x y =
    (x : uint32) + y

Também explicitamente, você pode especificar o valor de retorno de uma função fornecendo uma anotação de tipo depois que todos os parâmetros.

let addu1 x y : uint32 =
   x + y

Um caso comum onde uma anotação de tipo é útil em um parâmetro é quando o parâmetro é um tipo de objeto e você deseja usar um membro.

let replace(str: string) =
    str.Replace("A", "a")

Generalização automática

Se o código de função não depende do tipo de um parâmetro, o compilador considera o parâmetro a ser genérico. Isso é chamado de automática generalização, e pode ser um auxílio poderoso para escrever o código genérico sem aumentar a complexidade.

Por exemplo, a função a seguir combina dois parâmetros de qualquer tipo em uma tupla.

let makeTuple a b = (a, b)

O tipo é inferido para ser

'a -> 'b -> 'a * 'b

Informações adicionais

Inferência de tipo é descrita mais detalhadamente na especificação de linguagem F#.

Consulte também

Outros recursos

Generalização automática (F#)