Compartir a través de


Enlaces let (F#)

Un enlace asocia un identificador a un valor o una función. La palabra clave let se usa para enlazar un nombre a un valor o una función.

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

Comentarios

La palabra clave let se utiliza en las 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, tal y como se muestra a continuación.

let i = 1

Si se separa la expresión del identificador mediante una nueva línea, se deberá aplicar sangría a cada línea de la expresión, tal y como se muestra en el código siguiente.

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

En lugar de especificar solo un nombre, se puede especificar un modelo que contiene nombres; por ejemplo, una tupla, tal y 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 utilizan los nombres. La expresión de cuerpo aparece en su propia línea, con sangría para que quede alineada 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 de módulo, en la definición de un tipo de clase o en ámbitos locales, como en una definición de función. Un enlace let en el nivel superior de un módulo o un tipo de clase no requiere una expresión de cuerpo; sin embargo, en otros niveles de ámbito, sí se requiere la expresión de cuerpo. Los nombres enlazados pueden usarse después del punto de definición, pero no se pueden usar en ningún punto anterior al enlace let, tal y como se muestra en el código siguiente.

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

Enlaces de función

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

let function1 a =
    a + 1

En general, los parámetros son modelos (por ejemplo, un modelo 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 consiguiente, en el ejemplo de código siguiente, el valor de result se calcula a partir de 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 (F#).

Anotaciones de tipo

Si desea especificar los tipos de los parámetros, debe escribir entre paréntesis el nombre del parámetro seguido de un signo de dos puntos (:) y el nombre del tipo. También puede especificar el tipo de valor devuelto anexando el signo de dos puntos y el tipo a continuación del último parámetro. Las anotaciones de tipo completas para function1, con enteros como tipos de parámetro, son:

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 los parámetros de las funciones. Esto puede incluir la generalización automática del tipo de un parámetro como genérico.

Para obtener más información, vea Generalización automática (F#) e Inferencia de tipos (F#).

Enlaces let en clases

Un enlace let puede aparecer en un tipo de clase, pero no en un tipo de estructura o registro. Para utilizar un enlace let en un tipo de clase, la clase debe tener un constructor primario. Los parámetros de constructor deben aparecer después del nombre de tipo en la definición de clase. Un enlace let en un tipo de clase define los campos y miembros privados de ese tipo de clase y, junto con los enlaces do del tipo, forma el código para el constructor primario del tipo. En los ejemplos de código siguientes, se muestra una clase MyClass con los 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, vea Enlaces let en clases (F#) y Clases (F#).

Parámetros de tipo en los 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ícito. Un enlace let en una expresión, como una definición de función, no puede tener parámetros de tipo. Para obtener más información, vea Genéricos (F#).

Atributos en los enlaces let

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

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

Ámbito y accesibilidad de Enlaces Let

El ámbito de una entidad declarada con enlace let se limita a la parte del ámbito contenedor (como una función, módulo, un archivo o una clase) después de que aparezca el enlace. Por consiguiente, puede ser dicho que un enlace let introduce un nombre en un ámbito. En un módulo, un valor o una función enlazado es accesible para los clientes de un módulo mientras el módulo es accesible, ya que los enlaces let en un módulo son compilado en las funciones públicas del módulo. Por el contrario, los enlaces let en una clase son privado a la clase.

Normalmente, las funciones de módulos deben calificarse con el nombre del módulo cuando se utilizan en 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 un módulo pueden utilizar una declaración de importación para crear funciones dentro de ese módulo disponibles para su uso sin calificar por el nombre del módulo. En el ejemplo simplemente mencionado, los usuarios de módulo pueden en ese caso abra el módulo mediante la declaración de importación Module1 abierto y hace referencia después a function1 directamente.

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 de la lista de F# tiene este atributo.

Para obtener más información sobre los agentes y el control de acceso, vea Módulos (F#) y Control de acceso (F#).

Vea también

Referencia

Funciones (F#)

Enlaces let en clases (F#)