Literály
Tento článek obsahuje tabulku, která ukazuje, jak zadat typ literálu v jazyce F#.
Typy literálů
Následující tabulka ukazuje typy literálů v jazyce F#. Znaky, které představují číslice v šestnáctkovém zápisu, nerozlišují malá a velká písmena; znaky, které identifikují typ, rozlišují malá a velká písmena.
Typ | Popis | Přípona nebo předpona | Příklady |
---|---|---|---|
sbyte | Podepsané 8bitové celé číslo | y | 86y 0b00000101y |
bajt | 8bitové přirozené číslo bez znaménka | uy | 86uy 0b00000101uy |
int16 | Podepsané 16bitové celé číslo | s | 86s |
uint16 | 16bitové přirozené číslo bez znaménka | nás | 86us |
Int int32 |
Podepsané 32bitové celé číslo | l nebo žádný | 86 86l |
uint uint32 |
32bitové přirozené číslo bez znaménka | u nebo ul | 86u 86ul |
nativeint | nativní ukazatel na celé číslo se znaménkem | n | 123n |
unativeint | nativní ukazatel jako přirozené číslo bez znaménka | OSN | 0x00002D3Fun |
int64 | Podepsané 64bitové celé číslo | L | 86L |
uint64 | 64bitové přirozené číslo bez znaménka | UL | 86UL |
single, float32 | 32bitový číslo s plovoucí desetinnou čárkou | F nebo f |
4.14F nebo 4.14f nebo infinityf nebo -infinityf |
Lf | 0x00000000lf |
||
plout; dvojitý | 64bitové číslo s pohyblivou desetinnou čárkou | žádný |
4.14 nebo 2.3E+32 nebo 2.3e+32 nebo infinity nebo -infinity |
LF | 0x0000000000000000LF |
||
bigint | celé číslo není omezeno na 64bitovou reprezentaci | Já | 9999999999999999999999999999I |
desetinné číslo | Zlomkové číslo reprezentované jako pevné nebo racionální číslo | M nebo m |
0.7833M nebo 0.7833m |
Uklízečka | Znak Unicode | žádný |
'a' nebo '\u0061' |
Řetězec | Řetězec Unicode | žádný | "text\n" nebo @"c:\filename" nebo """<book title="Paradise Lost">""" nebo "string1" + "string2" Viz také řetězce. |
bajt | Znak ASCII | B | 'a'B |
byte[] | Řetězec ASCII | B | "text"B |
Řetězec nebo bajt[] | Doslovný řetězec | Předpona @ |
@"\\server\share" (Unicode)@"\\server\share"B (ASCII) |
Pojmenované literály
Hodnoty, které mají být konstanty, lze označit atributem Literál.
Tento atribut má vliv na to, že se hodnota zkompiluje jako konstanta. V následujícím příkladu jsou x
i y
níže neměnné hodnoty, ale x
se vyhodnocuje za běhu, zatímco y
je konstanta kompilace.
let x = "a" + "b" // evaluated at run-time
[<Literal>]
let y = "a" + "b" // evaluated at compile-time
Poznámka
Funkce nelze použít k výpočtu hodnot [<Literal>]
, protože literály musí být určeny v době kompilace a nemohou záviset na vyhodnocení za běhu.
Proč funkce nemohou vypočítat literály
Atribut [<Literal>]
vyžaduje, aby hodnoty byly známé v době kompilace. Funkce, i když se zdá, že vytvářejí konstantní výstupy, se vyhodnocují za běhu, což je nevhodné pro [<Literal>]
. Toto omezení zajišťuje bezpečné použití literálů ve scénářích, jako jsou porovnávání vzorů, argumenty atributů a interoperabilita s externími funkcemi.
Například pokus o přiřazení výsledku funkce k literálu selže:
[<Literal>]
let yFunc() = "a" + "b" // error FS0267: this is not a valid constant expression
Tento rozdíl je také důležitý při volání externí funkce . Například DllImport
je atribut, který potřebuje znát hodnotu myDLL
během kompilace. Bez deklarace [<Literal>]
by se tento kód nepodařilo zkompilovat:
[<Literal>]
let myDLL = "foo.dll"
[<DllImport(myDLL, CallingConvention = CallingConvention.Cdecl)>]
extern void HelloWorld()
Ve vzorových shodných výrazech se identifikátory začínající malými písmeny vždy považují za proměnné, které se mají vázat, a ne jako literály, takže při definování literálů byste měli obecně používat počáteční velká písmena.
[<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
Příklad stručného porovnávání vzorů pomocí pojmenovaných literálů
Pojmenované literály můžou usnadnit porovnávání vzorů tím, že se vyhnete nutnosti when
klauzulí nebo další logiky. Například:
[<Literal>]
let ErrorCode = 404
let handleResponse code =
match code with
| ErrorCode -> "Not Found"
| _ -> "Other Response"
Poznámky
Pojmenované literály jsou užitečné pro:
- Porovnávání vzorů bez klauzule
when
- Argumenty atributů
- Argumenty zprostředkovatele statického typu
Řetězce Unicode můžou obsahovat explicitní kódování, které můžete zadat pomocí \u
následovaného 16bitovým šestnáctkovým kódem (0000 – FFFF) nebo kódováníM UTF-32, které můžete zadat pomocí \U
následovaného 32bitovým šestnáctkovým kódem, který představuje jakýkoli bod kódu Unicode (00000000 – 0010FFFF).
Použití bitového operátoru jiného než |||
není povoleno.
Celá čísla v jiných základových soustavách
32bitové celá čísla se dají zadat také v šestnáctkovém, osmičkovém nebo binárním souboru pomocí 0x
, 0o
nebo 0b
předpony.
let numbers = (0x9F, 0o77, 0b1010)
// Result: numbers : int * int * int = (159, 63, 10)
Podtržítka v číselných literálech
Číslice můžete oddělit podtržítkem (_
).
let value = 0xDEAD_BEEF
let valueAsBits = 0b1101_1110_1010_1101_1011_1110_1110_1111
let exampleSSN = 123_45_6789
Speciální hodnoty nekonečna s pohyblivou řádovou čárkou
Číselné typy float
i single
s plovoucí čárkou mají přidružené speciální hodnoty představující kladné a záporné nekonečno.
Hodnota F# | Typ F# | Odpovídající hodnota .NET |
---|---|---|
infinity nebo +infinity |
float |
PositiveInfinity |
-infinity |
float |
NegativeInfinity |
infinityf nebo +infinityf |
single |
PositiveInfinity |
-infinityf |
single |
NegativeInfinity |
Tyto hodnoty lze použít přímo, nebo jsou výsledkem při dělení plovoucí desetinnou nulou nebo číslem tak malým, že ho daný typ nemůže reprezentovat. Například:
> 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