Inferencia de tiposType Inference

En este tema se describe F# cómo el compilador deduce los tipos de valores, variables, parámetros y valores devueltos.This topic describes how the F# compiler infers the types of values, variables, parameters and return values.

Inferencia de tipos en generalType Inference in General

La idea de la inferencia de tipos es que no es necesario especificar los tipos de F# construcciones excepto cuando el compilador no puede deducir el tipo de forma concluyente.The idea of type inference is that you do not have to specify the types of F# constructs except when the compiler cannot conclusively deduce the type. Omitir la información de tipo explícita no F# significa que se trata de un lenguaje con establecimiento dinámico de F# tipos o que los valores de están débilmente tipados.Omitting explicit type information does not mean that F# is a dynamically typed language or that values in F# are weakly typed. F#es un lenguaje de tipo estático, lo que significa que el compilador deduce un tipo exacto para cada construcción durante la compilación.F# is a statically typed language, which means that the compiler deduces an exact type for each construct during compilation. Si no hay información suficiente para que el compilador deduzca los tipos de cada construcción, debe proporcionar información de tipo adicional, normalmente agregando anotaciones de tipo explícito en algún lugar del código.If there is not enough information for the compiler to deduce the types of each construct, you must supply additional type information, typically by adding explicit type annotations somewhere in the code.

Inferencia de tipos de parámetro y de valor devueltoInference of Parameter and Return Types

En una lista de parámetros, no es necesario especificar el tipo de cada parámetro.In a parameter list, you do not have to specify the type of each parameter. Y, sin F# embargo, es un lenguaje de tipos estáticos y, por tanto, cada valor y expresión tiene un tipo definito en tiempo de compilación.And yet, F# is a statically typed language, and therefore every value and expression has a definite type at compile time. En el caso de los tipos que no se especifican de forma explícita, el compilador deduce el tipo basándose en el contexto.For those types that you do not specify explicitly, the compiler infers the type based on the context. Si el tipo no se especifica de otra forma, se deduce que es genérico.If the type is not otherwise specified, it is inferred to be generic. Si el código usa un valor de manera incoherente, de tal forma que no hay ningún tipo inferido único que cumpla todos los usos de un valor, el compilador informa de un error.If the code uses a value inconsistently, in such a way that there is no single inferred type that satisfies all the uses of a value, the compiler reports an error.

El tipo de valor devuelto de una función viene determinado por el tipo de la última expresión de la función.The return type of a function is determined by the type of the last expression in the function.

Por ejemplo, en el código siguiente, se infiere a que b int los tipos de parámetro y y el tipo de valor devuelto son 100 porque el literal intes de tipo.For example, in the following code, the parameter types a and b and the return type are all inferred to be int because the literal 100 is of type int.

let f a b = a + b + 100

Puede influir en la inferencia de tipos cambiando los literales.You can influence type inference by changing the literals. 100 Si realiza la uint32 adición del sufijo u, los tipos de a b, y el valor devuelto se deducen a. uint32If you make the 100 a uint32 by appending the suffix u, the types of a, b, and the return value are inferred to be uint32.

También puede influir en la inferencia de tipos mediante el uso de otras construcciones que impliquen restricciones en el tipo, como funciones y métodos que funcionan solo con un tipo determinado.You can also influence type inference by using other constructs that imply restrictions on the type, such as functions and methods that work with only a particular type.

Además, puede aplicar anotaciones de tipo explícitos a parámetros de función o de método o a variables en expresiones, tal como se muestra en los ejemplos siguientes.Also, you can apply explicit type annotations to function or method parameters or to variables in expressions, as shown in the following examples. Se producirán errores si se producen conflictos entre las distintas restricciones.Errors result if conflicts occur between different constraints.

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

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

También puede especificar explícitamente el valor devuelto de una función proporcionando una anotación de tipo después de todos los parámetros.You can also explicitly specify the return value of a function by providing a type annotation after all the parameters.

let addu1 x y : uint32 =
   x + y

Un caso común en el que una anotación de tipo es útil en un parámetro es cuando el parámetro es un tipo de objeto y se desea usar un miembro.A common case where a type annotation is useful on a parameter is when the parameter is an object type and you want to use a member.

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

Generalización automáticaAutomatic Generalization

Si el código de la función no depende del tipo de un parámetro, el compilador considera que el parámetro es genérico.If the function code is not dependent on the type of a parameter, the compiler considers the parameter to be generic. Esto se denomina generalización automáticay puede ser una ayuda eficaz para escribir código genérico sin aumentar la complejidad.This is called automatic generalization, and it can be a powerful aid to writing generic code without increasing complexity.

Por ejemplo, la función siguiente combina dos parámetros de cualquier tipo en una tupla.For example, the following function combines two parameters of any type into a tuple.

let makeTuple a b = (a, b)

Se deduce que el tipo esThe type is inferred to be

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

Información adicionalAdditional Information

La inferencia de tipos se describe con más detalle F# en la especificación del lenguaje.Type inference is described in more detail in the F# Language Specification.

Vea tambiénSee also