Enlaces letlet Bindings

Un enlace asocia un identificador con un valor o una función.A binding associates an identifier with a value or function. La let palabra clave se usa para enlazar un nombre a un valor o una función.You use the let keyword to bind a name to a value or function.

SintaxisSyntax

// Binding a value:
let identifier-or-pattern [: type] =expressionbody-expression
// Binding a function value:
let identifier parameter-list [: return-type ] =expressionbody-expression

ComentariosRemarks

La let palabra clave se usa en expresiones de enlace para definir valores o valores de función para uno o más nombres.The let keyword is used in binding expressions to define values or function values for one or more names. La forma más sencilla de la let expresión enlaza un nombre a un valor simple, como se indica a continuación.The simplest form of the let expression binds a name to a simple value, as follows.

let i = 1

Si separa la expresión del identificador usando una nueva línea, debe aplicar sangría a cada línea de la expresión, como en el código siguiente.If you separate the expression from the identifier by using a new line, you must indent each line of the expression, as in the following code.

let someVeryLongIdentifier =
    // Note indentation below.
    3 * 4 + 5 * 6

En lugar de simplemente un nombre, se puede especificar un patrón que contenga nombres, por ejemplo, una tupla, tal y como se muestra en el código siguiente.Instead of just a name, a pattern that contains names can be specified, for example, a tuple, as shown in the following code.

let i, j, k = (1, 2, 3)

El cuerpo-expresión es la expresión en la que se usan los nombres.The body-expression is the expression in which the names are used. La expresión de cuerpo aparece en su propia línea, con la sangría que se alinea exactamente con el primer carácter de let la palabra clave:The body expression appears on its own line, indented to line up exactly with the first character in the let keyword:

let result =

    let i, j, k = (1, 2, 3)

    // Body expression:
    i + 2*j + 3*k

Un let enlace puede aparecer en el nivel de módulo, en la definición de un tipo de clase o en ámbitos locales, como en una definición de función.A let binding can appear at the module level, in the definition of a class type, or in local scopes, such as in a function definition. No let es necesario que un enlace en el nivel superior de un módulo o de un tipo de clase tenga una expresión de cuerpo, sino que en otros niveles de ámbito, se requiere la expresión del cuerpo.A let binding at the top level in a module or in a class type does not need to have a body expression, but at other scope levels, the body expression is required. Los nombres enlazados se pueden usar después del punto de definición, pero no en ningún momento let antes de que aparezca el enlace, como se muestra en el código siguiente.The bound names are usable after the point of definition, but not at any point before the let binding appears, as is illustrated in the following code.

// Error:
printfn "%d" x
let x = 100
// OK:
printfn "%d" x

Enlaces de funciónFunction Bindings

Los enlaces de función siguen las reglas de los enlaces de valor, excepto que los enlaces de función incluyen el nombre de la función y los parámetros, como se muestra en el código siguiente.Function bindings follow the rules for value bindings, except that function bindings include the function name and the parameters, as shown in the following code.

let function1 a =
    a + 1

En general, los parámetros son patrones, como un patrón de tupla:In general, parameters are patterns, such as a tuple pattern:

let function2 (a, b) = a + b

Una let expresión de enlace se evalúa como el valor de la última expresión.A let binding expression evaluates to the value of the last expression. Por lo tanto, en el ejemplo de código siguiente, result el valor de se 100 * function3 (1, 2)calcula a partir de, 300que se evalúa como.Therefore, in the following code example, the value of result is computed from 100 * function3 (1, 2), which evaluates to 300.

let result =
    let function3 (a, b) = a + b
    100 * function3 (1, 2)

Para obtener más información, vea Funciones.For more information, see Functions.

Anotaciones de tipoType Annotations

Puede especificar los tipos para los parámetros incluyendo dos puntos (:) seguido de un nombre de tipo, todo entre paréntesis.You can specify types for parameters by including a colon (:) followed by a type name, all enclosed in parentheses. También puede especificar el tipo del valor devuelto anexando los dos puntos y el tipo después del último parámetro.You can also specify the type of the return value by appending the colon and type after the last parameter. Las anotaciones de tipo completo para function1, con enteros como tipos de parámetro, serían como se indica a continuación.The full type annotations for function1, with integers as the parameter types, would be as follows.

let function1 (a: int) : int = a + 1

Cuando no hay ningún parámetro de tipo explícito, se usa la inferencia de tipos para determinar los tipos de parámetros de las funciones.When there are no explicit type parameters, type inference is used to determine the types of parameters of functions. Esto puede incluir la generalización automática del tipo de un parámetro para que sea genérico.This can include automatically generalizing the type of a parameter to be generic.

Para obtener más información, vea generalización automática e inferencia de tipos.For more information, see Automatic Generalization and Type Inference.

Enlaces let en claseslet Bindings in Classes

Un let enlace puede aparecer en un tipo de clase, pero no en un tipo de estructura o de registro.A let binding can appear in a class type but not in a structure or record type. Para usar un enlace Let en un tipo de clase, la clase debe tener un constructor Primary.To use a let binding in a class type, the class must have a primary constructor. Los parámetros de constructor deben aparecer después del nombre de tipo en la definición de clase.Constructor parameters must appear after the type name in the class definition. Un let enlace en un tipo de clase define los campos privados y los miembros de ese tipo de clase do y, junto con los enlaces del tipo, crea el código para el constructor principal para el tipo.A let binding in a class type defines private fields and members for that class type and, together with do bindings in the type, forms the code for the primary constructor for the type. En los siguientes ejemplos de código se MyClass muestra una clase field1 con field2campos privados y.The following code examples show a class MyClass with private fields field1 and field2.

type MyClass(a) =
    let field1 = a
    let field2 = "text"
    do printfn "%d %s" field1 field2
    member this.F input =
        printfn "Field1 %d Field2 %s Input %A" field1 field2 input

Los ámbitos de field1 y field2 se limitan al tipo en el que se declaran.The scopes of field1 and field2 are limited to the type in which they are declared. Para obtener más información, vea let enlaces en clases y clases.For more information, see let Bindings in Classes and Classes.

Parámetros de tipo en los enlaces LetType Parameters in let Bindings

Un let enlace en el nivel de módulo, en un tipo o en una expresión de cálculo puede tener parámetros de tipo explícitos.A let binding at the module level, in a type, or in a computation expression can have explicit type parameters. Un enlace Let en una expresión, como dentro de una definición de función, no puede tener parámetros de tipo.A let binding in an expression, such as within a function definition, cannot have type parameters. Para más información, vea Genéricos.For more information, see Generics.

Atributos en enlaces LetAttributes on let Bindings

Los atributos se pueden aplicar a los enlaces let de nivel superior de un módulo, tal y como se muestra en el código siguiente.Attributes can be applied to top-level let bindings in a module, as shown in the following code.

[<Obsolete>]
let function1 x y = x + y

Ámbito y accesibilidad de los enlaces LetScope and Accessibility of Let Bindings

El ámbito de una entidad declarada con un enlace Let está limitado a la parte del ámbito contenedor (por ejemplo, una función, un módulo, un archivo o una clase) después de que aparezca el enlace.The scope of an entity declared with a let binding is limited to the portion of the containing scope (such as a function, module, file or class) after the binding appears. Por lo tanto, se puede decir que un enlace Let introduce un nombre en un ámbito.Therefore, it can be said that a let binding introduces a name into a scope. En un módulo, se puede acceder a un valor o función enlazado a los clientes de un módulo siempre que se pueda acceder al módulo, ya que los enlaces Let de un módulo se compilan en funciones públicas del módulo.In a module, a let-bound value or function is accessible to clients of a module as long as the module is accessible, since the let bindings in a module are compiled into public functions of the module. Por el contrario, los enlaces Let de una clase son privados para la clase.By contrast, let bindings in a class are private to the class.

Normalmente, las funciones de los módulos deben calificarse con el nombre del módulo cuando se usan en el código de cliente.Normally, functions in modules must be qualified by the name of the module when used by client code. Por ejemplo, si un módulo Module1 tiene una función function1, los usuarios especificarán Module1.function1 que hagan referencia a la función.For example, if a module Module1 has a function function1, users would specify Module1.function1 to refer to the function.

Los usuarios de un módulo pueden usar una declaración de importación para hacer que las funciones de ese módulo estén disponibles para su uso sin que el nombre del módulo los califique.Users of a module may use an import declaration to make the functions within that module available for use without being qualified by the module name. En el ejemplo que se acaba de mencionar, los usuarios del módulo pueden, en ese caso, abrir el módulo mediante Module1 la declaración de importación function1 Open y, a continuación, hacer referencia directamente a.In the example just mentioned, users of the module can in that case open the module by using the import declaration open Module1 and thereafter refer to function1 directly.

module Module1 =
    let function1 x = x + 1.0

module Module2 =
    let function2 x =
        Module1.function1 x

open Module1

let function3 x =
    function1 x

Algunos módulos tienen el atributo RequireQualifiedAccess, lo que significa que las funciones que exponen deben calificarse con el nombre del módulo.Some modules have the attribute RequireQualifiedAccess, which means that the functions that they expose must be qualified with the name of the module. Por ejemplo, el F# módulo List tiene este atributo.For example, the F# List module has this attribute.

Para obtener más información sobre los módulos y el control de acceso, consulte módulos y Access Control.For more information on modules and access control, see Modules and Access Control.

Vea tambiénSee also