deixar Ligações
Uma associação associa um identificador a um valor ou função. Use a let
palavra-chave para vincular um nome a um valor ou função.
Sintaxe
// Binding a value:
let identifier-or-pattern [: type] =expressionbody-expression
// Binding a function value:
let identifier parameter-list [: return-type ] =expressionbody-expression
Observações
A let
palavra-chave é usada em expressões de ligação para definir valores ou valores de função para um ou mais nomes. A forma mais simples da let
expressão vincula um nome a um valor simples, da seguinte forma.
let i = 1
Se você separar a expressão do identificador usando uma nova linha, deverá recuar cada linha da expressão, como no código a seguir.
let someVeryLongIdentifier =
// Note indentation below.
3 * 4 + 5 * 6
Em vez de apenas um nome, um padrão que contém nomes pode ser especificado, por exemplo, uma tupla, como mostrado no código a seguir.
let i, j, k = (1, 2, 3)
O corpo-expressão é a expressão na qual os nomes são usados. A expressão corporal aparece em sua própria linha, recuada para alinhar exatamente com o primeiro caractere na let
palavra-chave:
let result =
let i, j, k = (1, 2, 3)
// Body expression:
i + 2 * j + 3 * k
Uma let
associação pode aparecer no nível do módulo, na definição de um tipo de classe ou em escopos locais, como em uma definição de função. Uma let
ligação no nível superior em um módulo ou em um tipo de classe não precisa ter uma expressão de corpo, mas em outros níveis de escopo, a expressão de corpo é necessária. Os nomes vinculados são utilizáveis após o ponto de definição, mas não em nenhum ponto antes da let
ligação aparecer, como é ilustrado no código a seguir.
// Error:
printfn "%d" x
let x = 100
// OK:
printfn "%d" x
Ligações de função
As ligações de função seguem as regras para associações de valor, exceto que as ligações de função incluem o nome da função e os parâmetros, conforme mostrado no código a seguir.
let function1 a = a + 1
Em geral, os parâmetros são padrões, como um padrão de tupla:
let function2 (a, b) = a + b
Uma let
expressão de vinculação é avaliada pelo valor da última expressão. Portanto, no exemplo de código a seguir, o valor de é calculado a partir 100 * function3 (1, 2)
de result
, que avalia como 300
.
let result =
let function3 (a, b) = a + b
100 * function3 (1, 2)
Para obter mais informações, consulte Funções.
Anotações de tipo
Você pode especificar tipos para parâmetros incluindo dois pontos (:) seguidos por um nome de tipo, todos entre parênteses. Você também pode especificar o tipo do valor de retorno anexando os dois pontos e digite após o último parâmetro. As anotações de tipo completo para function1
, com inteiros como os tipos de parâmetro, seriam as seguintes.
let function1 (a: int) : int = a + 1
Quando não há parâmetros de tipo explícitos, a inferência de tipo é usada para determinar os tipos de parâmetros de funções. Isso pode incluir a generalização automática do tipo de parâmetro para ser genérico.
Para obter mais informações, consulte Generalização automática e inferência de tipo.
deixar Ligações em Classes
Uma let
associação pode aparecer em um tipo de classe, mas não em uma estrutura ou tipo de registro. Para usar uma ligação let em um tipo de classe, a classe deve ter um construtor primário. Os parâmetros do construtor devem aparecer após o nome do tipo na definição de classe. Uma let
associação em um tipo de classe define campos privados e membros para esse tipo de classe e, juntamente com do
associações no tipo, forma o código para o construtor primário para o tipo. Os exemplos de código a seguir mostram uma classe MyClass
com campos field1
privados e 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
Os âmbitos de aplicação e field1
field2
estão limitados ao tipo em que são declarados. Para obter mais informações, consulte let
Ligações em classes e classes.
Digite parâmetros em let Bindings
Uma let
ligação no nível do módulo, em um tipo ou em uma expressão de computação pode ter parâmetros de tipo explícitos. Uma associação let em uma expressão, como dentro de uma definição de função, não pode ter parâmetros de tipo. Para obter mais informações, consulte Genéricos.
Atributos em ligações de permissão
Os atributos podem ser aplicados a associações de nível let
superior em um módulo, conforme mostrado no código a seguir.
[<Obsolete>]
let function1 x y = x + y
Âmbito e Acessibilidade das Ligações de Arrendamento
O escopo de uma entidade declarada com uma associação let é limitado à parte do escopo que contém (como uma função, módulo, arquivo ou classe) depois que a associação aparece. Portanto, pode-se dizer que uma vinculação let introduz um nome em um escopo. Em um módulo, um valor ou função let-bound é acessível aos clientes de um módulo, desde que o módulo seja acessível, uma vez que as ligações let em um módulo são compiladas em funções públicas do módulo. Por outro lado, as associações de permissão em uma classe são privadas para a classe.
Normalmente, as funções em módulos devem ser qualificadas pelo nome do módulo quando usado pelo código do cliente. Por exemplo, se um módulo Module1
tiver uma função function1
, os usuários especificarão Module1.function1
para se referir à função.
Os utilizadores de um módulo podem utilizar uma declaração de importação para disponibilizar as funções desse módulo para utilização sem serem qualificados pelo nome do módulo. No exemplo que acabamos de mencionar, os utilizadores do módulo podem, nesse caso, abrir o módulo utilizando a declaração open Module1
de importação e, posteriormente, referir-se diretamente function1
.
module Module1 =
let function1 x = x + 1.0
module Module2 =
let function2 x =
Module1.function1 x
open Module1
let function3 x =
function1 x
Alguns módulos têm o atributo RequireQualifiedAccess, o que significa que as funções que eles expõem devem ser qualificadas com o nome do módulo. Por exemplo, o módulo Lista de F# tem esse atributo.
Para obter mais informações sobre módulos e controle de acesso, consulte Módulos e controle de acesso.