Dela via


Litteraler

Den här artikeln innehåller en tabell som visar hur du anger typen av en literal i F#.

Literaltyper

I följande tabell visas literaltyperna i F#. Tecken som representerar siffror i hexadecimal notation är inte skiftlägeskänsliga. tecken som identifierar typen är skiftlägeskänsliga.

Typ Beskrivning Suffix eller prefix Exempel
sbyte signerad 8-bit heltal y 86y

0b00000101y
byte osignerat 8-bitars naturligt tal uy 86uy

0b00000101uy
int16 signerat 16-bitars heltal s 86s
uint16 osignerat 16-bitars naturligt tal oss 86us
Int

int32
signerat 32-bit heltal l eller ingen 86

86l
uint

uint32
osignerat 32-bitars naturligt tal u eller ul 86u

86ul
nativeint ** ursprunglig pekare till ett signerat heltal n 123n
unativeint inbyggt pekare som ett osignerat naturligt tal ett 0x00002D3Fun
int64 Signerad 64 bitars heltal L 86L
uint64 osignerat 64-bitars naturligt tal UL 86UL
enkel, float32 32-bitars flyttalsnummer F eller f 4.14F eller 4.14f eller infinityf eller -infinityf
Lf 0x00000000lf
flyta; dubbel 64-bitars flyttalsnummer ingen 4.14 eller 2.3E+32 eller 2.3e+32 eller infinity eller -infinity
LF 0x0000000000000000LF
bigint heltal som inte är begränsat till 64-bitars representation Jag 9999999999999999999999999999I
decimal bråktal som representeras som en fast punkt eller ett rationellt tal M eller m 0.7833M eller 0.7833m
Röding Unicode-tecken ingen 'a' eller '\u0061'
Sträng Unicode-sträng ingen "text\n"

eller

@"c:\filename"

eller

"""<book title="Paradise Lost">"""

eller

"string1" + "string2"

Se även Strängar.
byte ASCII-tecken B 'a'B
byte[] ASCII-sträng B "text"B
Sträng eller byte[] ordagrann sträng @ prefix @"\\server\share" (Unicode)

@"\\server\share"B (ASCII)

Namngivna literaler

Värden som är avsedda att vara konstanter kan markeras med attributet Literal.

Det här attributet leder till att ett värde kompileras som en konstant. I följande exempel är både x och y nedan oföränderliga värden, men x utvärderas vid körning, medan y är en kompileringskonstant.

let x = "a" + "b" // evaluated at run-time

[<Literal>]
let y = "a" + "b" // evaluated at compile-time

Not

Funktioner kan inte användas för att beräkna [<Literal>] värden eftersom literaler måste fastställas vid kompileringstid och inte kan vara beroende av körningsutvärdering.

Varför funktioner inte kan beräkna literaler

Attributet [<Literal>] kräver att värden är kända vid kompileringstid. Funktioner, även om de verkar generera konstanta utdata, utvärderas vid körning, vilket gör dem olämpliga för [<Literal>]. Den här begränsningen säkerställer att literaler kan användas på ett säkert sätt i scenarier som mönstermatchning, attributargument och interop med externa funktioner.

Ett försök att tilldela resultatet av en funktion till en literal misslyckas till exempel:

[<Literal>]
let yFunc() = "a" + "b" // error FS0267: this is not a valid constant expression

Den här skillnaden är också viktig när du anropar en extern funktion. Till exempel är DllImport ett attribut som behöver veta värdet för myDLL under kompilering. Utan [<Literal>]-deklarationen skulle den här koden inte kompilera:

[<Literal>]
let myDLL = "foo.dll"

[<DllImport(myDLL, CallingConvention = CallingConvention.Cdecl)>]
extern void HelloWorld()

I mönstermatchningsuttryck behandlas identifierare som börjar med gemener alltid som variabler som ska bindas, i stället för som literaler, så du bör vanligtvis använda inledande versaler när du definierar literaler.

[<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

Exempel på koncis mönstermatchning med namngivna literaler

Namngivna literaler kan göra mönstermatchningen mer koncis genom att undvika behovet av when-satser eller ytterligare logik. Till exempel:

[<Literal>]
let ErrorCode = 404

let handleResponse code =
    match code with
    | ErrorCode -> "Not Found"
    | _ -> "Other Response"

Anmärkningar

Namngivna literaler är användbara för:

  • Mönstermatchning utan en when-sats.
  • Attributargument.
  • Argument för statiska typprovider.

Unicode-strängar kan innehålla explicita kodningar som du kan ange med hjälp av \u följt av en 16-bitars hexadecimal kod (0000 – FFFF) eller UTF-32 en kodningar som du kan ange med hjälp av \U följt av en 32-bitars hexadecimal kod som representerar valfri Unicode-kodpunkt (00000000 – 0010FFFF).

Andra bitoperatorer än ||| tillåts inte.

Heltal i andra baser

Signerade 32-bitars heltal kan också anges i hexadecimalt, oktalt eller binärt med hjälp av ett 0x, 0o eller 0b prefix.

let numbers = (0x9F, 0o77, 0b1010)
// Result: numbers : int * int * int = (159, 63, 10)

Understreck i numeriska literaler

Du kan separera siffror med understreckstecknet (_).

let value = 0xDEAD_BEEF

let valueAsBits = 0b1101_1110_1010_1101_1011_1110_1110_1111

let exampleSSN = 123_45_6789

Särskilda oändlighetsvärden för flyttalspunkter

Både float och single numeriska flyttalstyper har associerade specialvärden som representerar positiv och negativ oändlighet.

F#-värde F#-typ Motsvarande .NET-värde
infinity eller +infinity float PositiveInfinity
-infinity float NegativeInfinity
infinityf eller +infinityf single PositiveInfinity
-infinityf single NegativeInfinity

Dessa värden kan användas direkt eller returneras när de divideras med en flyttal noll eller ett tal som är för litet för att representeras av den angivna typen. Till exempel:

> 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