Bindingen toestaan
Een binding koppelt een id aan een waarde of functie. U gebruikt het let
trefwoord om een naam te binden aan een waarde of functie.
Syntaxis
// Binding a value:
let identifier-or-pattern [: type] =expressionbody-expression
// Binding a function value:
let identifier parameter-list [: return-type ] =expressionbody-expression
Opmerkingen
Het let
trefwoord wordt gebruikt in bindingexpressies om waarden of functiewaarden voor een of meer namen te definiëren. De eenvoudigste vorm van de let
expressie verbindt als volgt een naam aan een eenvoudige waarde.
let i = 1
Als u de expressie scheidt van de id met behulp van een nieuwe regel, moet u elke regel van de expressie laten inspringen, zoals in de volgende code.
let someVeryLongIdentifier =
// Note indentation below.
3 * 4 + 5 * 6
In plaats van alleen een naam kan een patroon met namen worden opgegeven, bijvoorbeeld een tuple, zoals wordt weergegeven in de volgende code.
let i, j, k = (1, 2, 3)
De hoofdtekstexpressie is de expressie waarin de namen worden gebruikt. De hoofdtekstexpressie wordt op een eigen regel weergegeven, ingesprongen om precies te worden uitgelijnd met het eerste teken in het let
trefwoord:
let result =
let i, j, k = (1, 2, 3)
// Body expression:
i + 2 * j + 3 * k
Een let
binding kan worden weergegeven op moduleniveau, in de definitie van een klassetype of in lokale bereiken, zoals in een functiedefinitie. Een let
binding op het hoogste niveau in een module of in een klassetype hoeft geen hoofdtekstexpressie te hebben, maar op andere bereikniveaus is de hoofdtekstexpressie vereist. De afhankelijke namen zijn bruikbaar na het definitiepunt, maar niet op een bepaald punt voordat de let
binding wordt weergegeven, zoals wordt geïllustreerd in de volgende code.
// Error:
printfn "%d" x
let x = 100
// OK:
printfn "%d" x
Functiebindingen
Functiebindingen volgen de regels voor waardebindingen, behalve dat functiebindingen de functienaam en de parameters bevatten, zoals wordt weergegeven in de volgende code.
let function1 a = a + 1
In het algemeen zijn parameters patronen, zoals een tuple-patroon:
let function2 (a, b) = a + b
Een let
bindingexpressie evalueert naar de waarde van de laatste expressie. Daarom wordt in het volgende codevoorbeeld de waarde berekend van result
100 * function3 (1, 2)
300
waaruit wordt geëvalueerd.
let result =
let function3 (a, b) = a + b
100 * function3 (1, 2)
Zie Functions voor meer informatie.
Aantekeningen typen
U kunt typen opgeven voor parameters door een dubbele punt op te geven (:) gevolgd door een typenaam, allemaal tussen haakjes. U kunt ook het type van de retourwaarde opgeven door de dubbele punt en het type na de laatste parameter toe te voegen. De volledige typeaantekeningen voor function1
, met gehele getallen als parametertypen, zijn als volgt.
let function1 (a: int) : int = a + 1
Wanneer er geen expliciete typeparameters zijn, wordt typedeductie gebruikt om de typen parameters van functies te bepalen. Dit kan omvatten het automatisch generaliseren van het type parameter dat algemeen moet zijn.
Zie Automatische generalisatie en typedeductie voor meer informatie.
Bindingen in klassen toestaan
Een let
binding kan worden weergegeven in een klassetype, maar niet in een structuur of recordtype. Als u een letbinding in een klassetype wilt gebruiken, moet de klasse een primaire constructor hebben. Constructorparameters moeten worden weergegeven na de typenaam in de klassedefinitie. Een let
binding in een klassetype definieert privévelden en leden voor dat klassetype en vormt, samen met do
bindingen in het type, de code voor de primaire constructor voor het type. In de volgende codevoorbeelden ziet u een klasse MyClass
met privévelden field1
en 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
De bereiken van field1
en field2
zijn beperkt tot het type waarin ze worden gedeclareerd. Zie let
Bindingen in klassen en klassen voor meer informatie.
Parameters typen in bindingen toestaan
Een let
binding op moduleniveau, in een type of in een berekeningsexpressie kan expliciete typeparameters bevatten. Een let binding in een expressie, zoals binnen een functiedefinitie, mag geen typeparameters hebben. Zie Generics voor meer informatie.
Kenmerken voor het toestaan van bindingen
Kenmerken kunnen worden toegepast op bindingen op het hoogste niveau let
in een module, zoals wordt weergegeven in de volgende code.
[<Obsolete>]
let function1 x y = x + y
Bereik en toegankelijkheid van letbindingen
Het bereik van een entiteit die is gedeclareerd met een let-binding, is beperkt tot het gedeelte van het betreffende bereik (zoals een functie, module, bestand of klasse) nadat de binding is weergegeven. Daarom kan worden gezegd dat een let binding een naam in een bereik introduceert. In een module is een let-gebonden waarde of functie toegankelijk voor clients van een module zolang de module toegankelijk is, omdat de bindingen in een module worden gecompileerd in openbare functies van de module. Laat bindingen in een klasse daarentegen privé zijn voor de klasse.
Normaal gesproken moeten functies in modules worden gekwalificeerd met de naam van de module wanneer deze wordt gebruikt door clientcode. Als een module Module1
bijvoorbeeld een functie function1
heeft, geven Module1.function1
gebruikers aan dat ze naar de functie verwijzen.
Gebruikers van een module kunnen een importdeclaratie gebruiken om de functies in die module beschikbaar te maken voor gebruik zonder te worden gekwalificeerd door de modulenaam. In het zojuist genoemde voorbeeld kunnen gebruikers van de module in dat geval de module openen met behulp van de importdeclaratie open Module1
en hierna rechtstreeks verwijzen function1
.
module Module1 =
let function1 x = x + 1.0
module Module2 =
let function2 x =
Module1.function1 x
open Module1
let function3 x =
function1 x
Sommige modules hebben het kenmerk RequireQualifiedAccess, wat betekent dat de functies die ze beschikbaar maken, moeten worden gekwalificeerd met de naam van de module. De module F#-lijst heeft bijvoorbeeld dit kenmerk.
Zie Modules en toegangsbeheer voor meer informatie over modules en toegangsbeheer.