Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un enlace asocia un identificador a un valor o función. Use la let palabra clave 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
Observaciones
La let palabra clave 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 let expresión 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 sangr 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, 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 body aparece en su propia línea, con sangría para alinearse exactamente con el primer carácter de la let palabra clave:
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. Un let enlace en el nivel superior de un módulo o en un tipo de clase no necesita tener una expresión de cuerpo, pero en otros niveles de ámbito, 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 let enlace, 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 reglas de los enlaces de valor, salvo 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.
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 let expresión de enlace 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 parámetros incluyendo dos puntos (:) seguidos de un nombre de tipo, todos entre paréntesis. También puede especificar el tipo del valor devuelto anexando los dos puntos y el tipo después del último parámetro. Las anotaciones de tipo completo para function1, con enteros como tipos de parámetro, serían los 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 obtener más información, vea Generalización automática e Inferencia de tipos.
let Bindings in Classes
Un let enlace 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 let enlace en un tipo de clase define campos privados y miembros para ese tipo de clase y, junto con do enlaces del tipo, forma el código para el constructor principal para el tipo. En los ejemplos de código siguientes se muestra una clase MyClass con campos field1 privados 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 let Enlaces en clases y clases.
Parámetros de tipo en 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. Un enlace let en una expresión, como dentro de una definición de función, no puede tener parámetros de tipo. Para obtener más información, vea Genéricos.
Atributos de let Bindings
Los atributos se pueden aplicar a enlaces de nivel let superior en un módulo, como se muestra en el código siguiente.
[<Obsolete>]
let function1 x y = x + y
Ámbito y accesibilidad de enlaces Let
El ámbito de una entidad declarada con un enlace let se limita a la parte del ámbito contenedor (como 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, se puede acceder a un valor o una función enlazados a let a los clientes de un módulo 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, los enlaces de una clase son privados para la clase .
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 que hagan referencia a la función.
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 esté calificado. En el ejemplo mencionado, los usuarios del módulo pueden abrir el módulo mediante la declaración open Module1 de importación y, después, hacer referencia directamente 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 Lista 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.