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)
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#).
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