Inferência de tipos (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 é 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. Informações de tipo explícito a omissão 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 parâmetro e tipos de retorno
Em uma lista de parâmetro, você não precisará especificar o tipo de cada parâmetro. E ainda, F# é uma linguagem digitada estaticamente e, portanto, cada valor e a expressão tem um tipo definido no momento da compilação. Para esses tipos que você não especifica explicitamente, o compilador infere o tipo com base no contexto. Se o tipo não é outra forma 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 a 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 sobre o 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, conforme 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
Você pode especificar também explicitamente o valor de retorno de uma função, fornecendo a 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 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 coleção de itens.
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#.