常值
本文提供表格,說明如何在 F# 中指定常值的類型。
常值類型
下表顯示 F# 中的常值類型。 代表十六進位標記法中數字的字元不區分大小寫;識別類型的字元會區分大小寫。
類型 | 描述 | 尾碼或前置詞 | 範例 |
---|---|---|---|
sbyte | 帶正負號的 8 位元整數 | y | 86y 0b00000101y |
byte | 不帶正負號的 8 位自然數 | uy | 86uy 0b00000101uy |
int16 | 帶正負號的 16 位元整數 | s | 86s |
uint16 | 不帶正負號的 16 位元自然數 | us | 86us |
int int32 |
帶正負號的 32 位元整數 | l 或無 | 86 86l |
uint uint32 |
不帶正負號的 32 位元自然數 | u 或 ul | 86u 86ul |
nativeint | 帶正負號自然數的原生指標 | n | 123n |
unativeint | 做為不帶正負號自然數的原生指標 | un | 0x00002D3Fun |
int64 | 帶正負號的 64 位元整數 | L | 86L |
uint64 | 不帶正負號的 64 位元自然數 | UL | 86UL |
單精度浮點數,float32 | 32 位元浮點數 | F 或 f | 4.14F 、4.14f 、infinityf 或 -infinityf |
lf | 0x00000000lf |
||
浮點數;雙精度浮點數 | 64 位元浮點數 | none | 4.14 或 2.3E+32 或 2.3e+32 或 infinity 或 -infinity |
LF | 0x0000000000000000LF |
||
bigint | 不限於 64 位元表示方式的整數 | I | 9999999999999999999999999999I |
decimal | 以定點數或有理數表示的小數 | M 或 m | 0.7833M 或 0.7833m |
Char | Unicode 字元 | none | 'a' 或 '\u0061' |
String | Unicode 字串 | none | "text\n" 或 @"c:\filename" 或 """<book title="Paradise Lost">""" 或 "string1" + "string2" 另請參閱字串。 |
byte | ASCII 字元 | B | 'a'B |
byte[] | ASCII 字串 | B | "text"B |
字串或位元組[] | 逐字字串 | @ 前置詞 | @"\\server\share" (Unicode)@"\\server\share"B (ASCII) |
具名常值
預期為常數的值可以使用 Literal 屬性標記。
這個屬性的效果是會將值編譯為常數。 在下列範例中,以下的 x
和 y
都是不可變的值,但會在執行階段評估 x
,而 y
則是編譯時間常數。
let x = "a" + "b" // evaluated at run-time
[<Literal>]
let y = "a" + "b" // evaluated at compile-time
例如,此區別在呼叫外部函式時很重要,因為 DllImport
是編譯期間需要知道的值 myDLL
的屬性。 如果沒有 [<Literal>]
宣告,此程式代碼即無法編譯:
[<Literal>]
let myDLL = "foo.dll"
[<DllImport(myDLL, CallingConvention = CallingConvention.Cdecl)>]
extern void HelloWorld()
在模式比對運算式中,以小寫字元開頭的識別碼一律視為要繫結的變數,而不是常值,因此當您定義常值時,一般應該使用字首大寫。
[<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
備註
具名常值適用於:
- 沒有
when
子句的模式比對。 - 屬性引數。
- 靜態類型提供者引數。
Unicode 字串可包含明確的編碼,指定方式是使用 \u
,後面再加上 16 位元十六進位程式碼 (0000 - FFFF),也可以包含 UTF-32 編碼,指定方式是使用 \U
,後面再加上代表任何 Unicode 字碼指標 (00000000 - 0010FFFF) 的 32 位元十六進位程式碼。
不允許使用 |||
以外的位元運算子。
其他基底中的整數
帶正負號的 32 位元整數也可以分別使用 0x
、0o
或 0b
前置詞,以十六進位、八進位或二進位指定。
let numbers = (0x9F, 0o77, 0b1010)
// Result: numbers : int * int * int = (159, 63, 10)
數值常值中的底線
您可以使用底線字元 (_
) 分隔數字。
let value = 0xDEAD_BEEF
let valueAsBits = 0b1101_1110_1010_1101_1011_1110_1110_1111
let exampleSSN = 123_45_6789
特殊浮動點無限大值
float
和 single
浮動點數值類型都有代表無限大的正數和負數的相關特殊值。
F# 值 | F# 類型 | 對應的 .NET 值 |
---|---|---|
infinity 或 +infinity |
float |
PositiveInfinity |
-infinity |
float |
NegativeInfinity |
infinityf 或 +infinityf |
single |
PositiveInfinity |
-infinityf |
single |
NegativeInfinity |
這些值可以直接使用,或者會在除以浮動點零或太小而無法以指定類型表示的數字時傳回。 例如:
> 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