Literale
Dieser Artikel enthält eine Tabelle, in der gezeigt wird, wie der Typ eines Literals in F# angegeben wird.
Literaltypen
In der folgenden Tabelle werden die Literaltypen in F# angegeben. Bei Zeichen, die Ziffern in Hexadezimalschreibweise darstellen, wird die Groß-/Kleinschreibung nicht beachtet. Bei Zeichen, die den Typ angeben, wird die Groß-/Kleinschreibung beachtet.
Typ | Beschreibung | Suffix oder Präfix | Beispiele |
---|---|---|---|
sbyte | ganze 8-Bit-Zahl mit Vorzeichen | j | 86y 0b00000101y |
byte | Nicht signierte 8-Bit-natürliche Zahl | uy | 86uy 0b00000101uy |
int16 | ganze 16-Bit-Zahl mit Vorzeichen | s | 86s |
uint16 | Nicht signierte 16-Bit-natürliche Zahl | USA | 86us |
INT int32 |
ganze 32-Bit-Zahl mit Vorzeichen | l oder keine | 86 86l |
uint uint32 |
Nicht signierte natürliche 32-Bit-Zahl | u oder ul | 86u 86ul |
nativeint | nativer Zeiger auf eine natürliche Zahl mit Vorzeichen | n | 123n |
unativeint | nativer Zeiger als nicht signierte natürliche Zahl | un | 0x00002D3Fun |
int64 | ganze 64-Bit-Zahl mit Vorzeichen | L | 86L |
uint64 | Nicht signierte natürliche 64-Bit-Zahl | UL | 86UL |
single, float32 | 32-Bit-Gleitkommazahl | F oder f | 4.14F oder 4.14f oder infinityf oder -infinityf |
lf | 0x00000000lf |
||
float; double | 64-Bit-Gleitkommazahl | nichts | 4.14 oder 2.3E+32 oder 2.3e+32 oder infinity oder -infinity |
LF | 0x0000000000000000LF |
||
BIGINT | ganze Zahl, die nicht auf 64-Bit-Darstellung beschränkt ist | Ich | 9999999999999999999999999999I |
Decimal | Bruchzahl, die als fester Punkt oder rationale Zahl dargestellt wird | M oder m | 0.7833M oder 0.7833m |
Char | Unicode-Zeichen | nichts | 'a' oder '\u0061' |
Schnur | Unicode-Zeichenfolge | nichts | "text\n" oder @"c:\filename" oder """<book title="Paradise Lost">""" oder "string1" + "string2" Siehe auch Zeichenfolgen. |
byte | ASCII-Zeichen | B | 'a'B |
byte[] | ASCII-Zeichenfolge | B | "text"B |
String oder byte[] | wörtliche Zeichenfolge | @-Präfix | @"\\server\share" (Unicode)@"\\server\share"B (ASCII) |
Benannte Literale
Werte, die Konstanten sein sollen, können mit dem attribut Literal gekennzeichnet werden.
Dieses Attribut hat die Auswirkung, dass ein Wert als Konstante kompiliert wird. Im folgenden Beispiel sind sowohl x
als auch y
unten unveränderliche Werte, während x
zur Laufzeit ausgewertet werden, während y
eine Kompilierungszeitkonstante ist.
let x = "a" + "b" // evaluated at run-time
[<Literal>]
let y = "a" + "b" // evaluated at compile-time
Anmerkung
Funktionen können nicht zur Berechnung von [<Literal>]
-Werten verwendet werden, da Literale zur Kompilierungszeit festgelegt werden müssen und nicht von der Laufzeitauswertung abhängen können.
Warum Funktionen keine Literale berechnen können
Für das attribut [<Literal>]
müssen Werte zur Kompilierungszeit bekannt sein. Funktionen, auch wenn sie scheinbar konstante Ausgaben erzeugen, werden zur Laufzeit ausgewertet, wodurch sie für [<Literal>]
ungeeignet sind. Diese Einschränkung stellt sicher, dass Literale in Szenarien wie Musterabgleich, Attributargumenten und Interoperabilität mit externen Funktionen sicher verwendet werden können.
Wenn Sie beispielsweise versuchen, das Ergebnis einer Funktion einem Literal zuzuweisen, schlägt folgendes fehl:
[<Literal>]
let yFunc() = "a" + "b" // error FS0267: this is not a valid constant expression
Diese Unterscheidung ist auch beim Aufrufen einer externen Funktionwichtig. Beispielsweise ist DllImport
ein Attribut, das den Wert von myDLL
während der Kompilierung kennen muss. Ohne die [<Literal>]
-Deklaration kann dieser Code nicht kompiliert werden:
[<Literal>]
let myDLL = "foo.dll"
[<DllImport(myDLL, CallingConvention = CallingConvention.Cdecl)>]
extern void HelloWorld()
Bei Musterabgleichsausdrücken werden Bezeichner, die mit Kleinbuchstaben beginnen, immer als zu bindende Variablen und nicht als Literale behandelt, daher sollten Sie beim Definieren von Literalen in der Regel Anfangsbuchstaben verwenden.
[<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
Beispiel für einen präzisen Musterabgleich mit benannten Literalen
Benannte Literale können den Musterabgleich präziser gestalten, da keine when
-Klauseln oder zusätzliche Logik notwendig sind. Zum Beispiel:
[<Literal>]
let ErrorCode = 404
let handleResponse code =
match code with
| ErrorCode -> "Not Found"
| _ -> "Other Response"
Bemerkungen
Benannte Literale sind nützlich für:
- Musterabgleich ohne
when
-Klausel. - Attributargumente.
- Statische Typanbieterargumente.
Unicode-Zeichenfolgen können explizite Codierungen enthalten, die Sie mithilfe von \u
gefolgt von einem 16-Bit-Hexadezimalcode (0000 - FFFF) oder UTF-32-Codierungen angeben können, die Sie mithilfe von \U
gefolgt von einem 32-Bit-Hexadezimalcode angeben können, der einen Unicode-Codepunkt darstellt (0000000 - 0010FFFF).
Die Verwendung anderer bitweiser Operatoren als |||
ist nicht zulässig.
Ganze Zahlen in anderen Basen
Signierte 32-Bit-Ganzzahlen können auch mithilfe eines 0x
, 0o
oder 0b
Präfixes in hexadezimal, oktal oder binär angegeben werden.
let numbers = (0x9F, 0o77, 0b1010)
// Result: numbers : int * int * int = (159, 63, 10)
Unterstriche in numerischen Literalen
Sie können Ziffern mit dem Unterstrichzeichen (_
) trennen.
let value = 0xDEAD_BEEF
let valueAsBits = 0b1101_1110_1010_1101_1011_1110_1110_1111
let exampleSSN = 123_45_6789
Spezielle Gleitkomma-Unendlichkeitswerte
Sowohl die float
als auch single
numerischen Gleitkommatypen weisen spezielle Werte auf, die positive und negative Unendlichkeit darstellen.
F#-Wert | F#-Typ | Entsprechender .NET-Wert |
---|---|---|
infinity oder +infinity |
float |
PositiveInfinity |
-infinity |
float |
NegativeInfinity |
infinityf oder +infinityf |
single |
PositiveInfinity |
-infinityf |
single |
NegativeInfinity |
Diese Werte können direkt verwendet werden oder werden bei der Division durch eine Null mit Gleitkomma oder eine Zahl, die zu klein ist, um durch den angegebenen Typ dargestellt zu werden, zurückgegeben. Zum Beispiel:
> 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