Share via


Enlaces let

Un enlace asocia un identificador a un valor o función. Use la palabra clave let para enlazar un nombre a un valor o función.

Sintaxis

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

Comentarios

La palabra clavelet se usa en expresiones de enlace para definir valores o valores de función para uno o varios nombres. La forma más sencilla de la expresión let enlaza un nombre a un valor simple, como se indica a continuación.

let i = 1

Si separa la expresión del identificador mediante una nueva línea, debe aplicar sangría en cada línea de la expresión, como en el código siguiente.

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

En lugar de simplemente un nombre, se puede especificar un patrón que contenga nombres, como, por ejemplo, una tupla, como se muestra en el código siguiente.

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

Body-expression es la expresión en la que se usan los nombres. La expresión del cuerpo aparece en su propia línea, con sangría aplicada para alinearse exactamente con el primer carácter de la palabra clave let:

let result =

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

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

Un enlace let puede aparecer en el nivel del módulo, en la definición de un tipo de clase o en ámbitos locales, como, por ejemplo, en una definición de función. Un enlace let en el nivel superior de un módulo o en un tipo de clase no necesita tener una expresión de cuerpo, aunque en otros niveles de ámbito sí se requiere la expresión de cuerpo. Los nombres enlazados se pueden usar después del punto de definición, pero no en ningún momento antes de que aparezca el enlace let, tal como se muestra en el código siguiente.

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

Enlaces de funciones

Los enlaces de funciones siguen las reglas de los enlaces de valor, salvo que los enlaces de función incluyen el nombre de la función y los parámetros, tal como se muestra en el código siguiente.

let function1 a = a + 1

En general, los parámetros son patrones, como un patrón de tupla:

let function2 (a, b) = a + b

Una expresión de enlace let se evalúa como el valor de la última expresión. Por lo tanto, en el ejemplo de código siguiente, el valor de result se calcula desde 100 * function3 (1, 2), que se evalúa como 300.

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

Para obtener más información, vea Funciones.

Anotaciones de tipo

Puede especificar tipos para los parámetros si incluye dos puntos (:) seguidos de un nombre de tipo, todos entre paréntesis. También puede especificar el tipo del valor devuelto al anexar los dos puntos y el tipo después del último parámetro. Las anotaciones de tipo completas para function1, con enteros como tipos de parámetro, serían las siguientes.

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

Cuando no hay parámetros de tipo explícitos, se usa la inferencia de tipos para determinar los tipos de parámetros de las funciones. Esto puede incluir la generalización automática del tipo de un parámetro para que sea genérico.

Para más información, consulte Generalización automática e Inferencia de tipos.

Enlaces let en clases

Un enlace let puede aparecer en un tipo de clase, pero no en una estructura o tipo de registro. Para usar un enlace let en un tipo de clase, la clase debe tener un constructor principal. Los parámetros del constructor deben aparecer después del nombre de tipo en la definición de clase. Un enlace let de un tipo de clase define miembros y campos privados para ese tipo de clase y, junto con los enlaces do en el tipo, forma el código para el constructor principal del tipo. Los ejemplos de código siguientes muestran una clase MyClass con campos privados field1 y 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. Para obtener más información, consulte let Enlaces en clases y Clases.

Parámetros de tipo en enlaces let

Un enlace let 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. Un enlace let en una expresión, como, por ejemplo, dentro de una definición de función, no puede tener parámetros de tipo. Para más información, vea Genéricos.

Atributos en los enlaces let

Los atributos se pueden aplicar a enlaces let de nivel superior en un módulo, tal como se muestra en el código siguiente.

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

Ámbito y accesibilidad de los enlaces Let

El ámbito de una entidad declarada con un enlace let se limita a la parte del ámbito contenedor (como, por ejemplo, una función, un módulo, un archivo o una clase) después de que aparezca el enlace. Por lo tanto, se puede decir que un enlace let introduce un nombre en un ámbito. En un módulo, los clientes de dicho módulo podrán acceder a un valor o una función dependientes de let siempre que el módulo sea accesible, ya que los enlaces let de un módulo se compilan en funciones públicas del módulo. Por el contrario, en las clases, los enlaces let son privados para las clases.

Normalmente, las funciones de los módulos deben calificarse por el nombre del módulo cuando lo use el código de cliente. Por ejemplo, si un módulo Module1 tiene una función function1, los usuarios especificarían Module1.function1 para hacer referencia a la función.

Los usuarios de módulos pueden usar una declaración de importación para que las funciones de dicho módulo estén disponibles para su uso sin que el nombre del módulo esté calificado. En el ejemplo que se acaba de mencionar, los usuarios del módulo pueden abrir el módulo mediante la declaración de importación open Module1 y, a continuación, hacer referencia directa a function1.

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. Por ejemplo, el módulo List de F# tiene este atributo.

Para obtener más información sobre los módulos y el control de acceso, consulte Módulos y Control de acceso.

Vea también