共用方式為


常值

本文提供表格,說明如何在 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.14F4.14finfinityf-infinityf
lf 0x00000000lf
浮點數;雙精度浮點數 64 位元浮點數 none 4.142.3E+322.3e+32infinity-infinity
LF 0x0000000000000000LF
bigint 不限於 64 位元表示方式的整數 I 9999999999999999999999999999I
decimal 以定點數或有理數表示的小數 M 或 m 0.7833M0.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 屬性標記。

這個屬性的效果是會將值編譯為常數。 在下列範例中,以下的 xy 都是不可變的值,但會在執行階段評估 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 位元整數也可以分別使用 0x0o0b 前置詞,以十六進位、八進位或二進位指定。

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

特殊浮動點無限大值

floatsingle 浮動點數值類型都有代表無限大的正數和負數的相關特殊值。

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