Letterlijke tekens
Dit artikel bevat een tabel die laat zien hoe u het type van een literal in F# kunt opgeven.
Letterlijke typen
In de volgende tabel ziet u de letterlijke typen in F#. Tekens die cijfers in hexadecimale notatie vertegenwoordigen, zijn niet hoofdlettergevoelig; tekens die het type identificeren, zijn hoofdlettergevoelig.
Type | Beschrijving | Achtervoegsel of voorvoegsel | Voorbeelden |
---|---|---|---|
sbyte | 8-bits integer met teken | y | 86y 0b00000101y |
byte | niet-ondertekend 8-bits natuurlijk getal | uy | 86uy 0b00000101uy |
int16 | ondertekend 16-bits geheel getal | s | 86s |
uint16 | ongesigneerde 16-bits natuurlijk getal | ons | 86us |
Int int32 |
getekend 32-bits geheel getal | l of geen | 86 86l |
uint uint32 |
niet-ondertekend 32-bits natuurlijk getal | u of ul | 86u 86ul |
nativeint | systeemeigen aanwijzer naar een ondertekend natuurlijk getal | n | 123n |
unativeint | systeemeigen aanwijzer als een niet-ondertekend natuurlijk getal | un | 0x00002D3Fun |
int64 | 64-bits tekengetal | L | 86L |
uint64 | niet-ondertekend 64-bits natuurlijk getal | UL | 86UL |
enkelvoudig, float32 | 32-bits drijvendekommanummer | F of f |
4.14F of 4.14f of infinityf of -infinityf |
Lf | 0x00000000lf |
||
drijven; dubbel | 64-bit drijvende kommagetal | geen |
4.14 of 2.3E+32 of 2.3e+32 of infinity of -infinity |
LF | 0x0000000000000000LF |
||
bigint | een geheel getal dat niet beperkt is tot een 64-bits weergave | Ik | 9999999999999999999999999999I |
decimaal | fractioneel getal dat wordt weergegeven als een vast punt of rationeel getal | M of m |
0.7833M of 0.7833m |
Verkolen | Unicode-teken | geen |
'a' of '\u0061' |
Snaar | Unicode-tekenreeks | geen | "text\n" of @"c:\filename" of """<book title="Paradise Lost">""" of "string1" + "string2" Zie ook tekenreeksen. |
byte | ASCII-teken | B | 'a'B |
byte[] | ASCII-tekenreeks | B | "text"B |
Tekenreeks of byte[] | letterlijke tekenreeks | @ voorvoegsel |
@"\\server\share" (Unicode)@"\\server\share"B (ASCII) |
Benoemde letterlijke tekens
Waarden die zijn bedoeld om constanten te zijn, kunnen worden gemarkeerd met het kenmerk Letterlijke.
Dit kenmerk heeft het effect dat een waarde als een constante wordt gecompileerd. In het volgende voorbeeld zijn zowel x
als y
hieronder onveranderbare waarden, maar x
wordt tijdens runtime geëvalueerd, terwijl y
een compilatieconstante is.
let x = "a" + "b" // evaluated at run-time
[<Literal>]
let y = "a" + "b" // evaluated at compile-time
Notitie
Functies kunnen niet worden gebruikt om [<Literal>]
waarden te berekenen, omdat letterlijke waarden tijdens het compileren moeten worden bepaald en niet afhankelijk kunnen zijn van runtime-evaluatie.
Waarom functies geen letterlijke gegevens kunnen berekenen
Voor het kenmerk [<Literal>]
moeten waarden tijdens het compileren bekend zijn. Functies, zelfs als ze constante uitvoer lijken te produceren, worden tijdens runtime geëvalueerd, waardoor ze ongeschikt zijn voor [<Literal>]
. Deze beperking zorgt ervoor dat letterlijke waarden veilig kunnen worden gebruikt in scenario's zoals patroonkoppeling, kenmerkargumenten en interop met externe functies.
Als u bijvoorbeeld probeert het resultaat van een functie toe te wijzen aan een letterlijke waarde, zal dit mislukken.
[<Literal>]
let yFunc() = "a" + "b" // error FS0267: this is not a valid constant expression
Dit onderscheid is ook van belang bij het aanroepen van een externe functie.
DllImport
is bijvoorbeeld een kenmerk dat de waarde van myDLL
tijdens de compilatie moet weten. Zonder de declaratie [<Literal>]
kan deze code niet worden gecompileerd:
[<Literal>]
let myDLL = "foo.dll"
[<DllImport(myDLL, CallingConvention = CallingConvention.Cdecl)>]
extern void HelloWorld()
In patroonkoppelingsexpressies worden id's die beginnen met kleine letters altijd behandeld als variabelen die moeten worden gebonden, in plaats van als letterlijke waarden, dus moet u in het algemeen initiële hoofdletters gebruiken wanneer u letterlijke waarden definieert.
[<Literal>]
let SomeJson = """{"numbers":[1,2,3,4,5]}"""
[<Literal>]
let Literal1 = "a" + "b"
[<Literal>]
let FileLocation = __SOURCE_DIRECTORY__ + "/" + __SOURCE_FILE__
[<Literal>]
let Literal2 = 1 ||| 64
[<Literal>]
let Literal3 = System.IO.FileAccess.Read ||| System.IO.FileAccess.Write
Voorbeeld van beknopt patroon dat overeenkomt met benoemde letterlijke waarden
Benoemde letterlijke waarden kunnen patroonmatching beknopter maken door de noodzaak voor when
-clausules of aanvullende logica te vermijden. Bijvoorbeeld:
[<Literal>]
let ErrorCode = 404
let handleResponse code =
match code with
| ErrorCode -> "Not Found"
| _ -> "Other Response"
Opmerkingen
Benoemde literals zijn handig voor:
- Patroonvergelijking zonder een
when
clausule. - Kenmerkargumenten.
- Statische typeprovider-argumenten.
Unicode-tekenreeksen kunnen expliciete coderingen bevatten die u kunt opgeven met behulp van \u
gevolgd door een 16-bits hexadecimale code (0000 - FFFF) of UTF-32-coderingen die u kunt opgeven met behulp van \U
gevolgd door een 32-bits hexadecimale code die elk Unicode-codepunt vertegenwoordigt (000000000 - 0010FFFF).
Het gebruik van andere bitsgewijze operatoren dan |||
is niet toegestaan.
Gehele getallen in andere bases
Ondertekende 32-bits gehele getallen kunnen ook worden opgegeven in hexadecimaal, octaal of binair met respectievelijk een 0x
, 0o
of 0b
voorvoegsel.
let numbers = (0x9F, 0o77, 0b1010)
// Result: numbers : int * int * int = (159, 63, 10)
Onderstrepingstekens in numerieke literalen
U kunt cijfers scheiden met het onderstrepingsteken (_
).
let value = 0xDEAD_BEEF
let valueAsBits = 0b1101_1110_1010_1101_1011_1110_1110_1111
let exampleSSN = 123_45_6789
Speciale oneindige waarden voor zwevende komma
Zowel de float
als de single
drijvende-komma numerieke typen hebben speciale waarden die zijn gekoppeld aan positief en negatief oneindigheid.
F#-waarde | F#-type | Corresponderende .NET-waarde |
---|---|---|
infinity of +infinity |
float |
PositiveInfinity |
-infinity |
float |
NegativeInfinity |
infinityf of +infinityf |
single |
PositiveInfinity |
-infinityf |
single |
NegativeInfinity |
Deze waarden kunnen rechtstreeks worden gebruikt of worden geretourneerd bij het delen door een drijvendekommageul of een getal dat te klein is om te worden weergegeven door het opgegeven type. Bijvoorbeeld:
> 1.0/0.0;;
val it: float = infinity
> 1.0/(-0.0);;
val it: float = -infinity
> 1.0/0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
;;
val it: float = infinity