活动
文本
本文提供了一个表,该表展示了如何指定 F# 中的文本类型。
下表展示了 F# 中的文本类型。 表示十六进制表示法中的数字的字符不区分大小写,标识类型的字符则区分大小写。
类型 | 描述 | 后缀或前缀 | 例子 |
---|---|---|---|
sbyte | 有符号 8 位整数 | y | 86y 0b00000101y |
字节 | 无符号 8 位自然数字 | uy | 86uy 0b00000101uy |
int16 | 有符号 16 位整数 | s | 86s |
uint16 | 无符号 16 位自然数 | 我们 | 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 |
single、float32 | 32 位浮点数 | F 或 f | 4.14F 、4.14f 、infinityf 或 -infinityf |
lf | 0x00000000lf |
||
float; double | 64 位浮点数 | 没有 | 4.14 、2.3E+32 、2.3e+32 、infinity 或 -infinity |
LF | 0x0000000000000000LF |
||
bigint | 整数不限于 64 位表示形式 | 我 | 9999999999999999999999999999I |
十进制 | 分数表示为定点数或有理数 | M 或 m | 0.7833M 或 0.7833m |
Char | Unicode 字符 | 没有 | 'a' 或 '\u0061' |
字符串 | Unicode 字符串 | 没有 | "text\n" 或 @"c:\filename" 或 """<book title="Paradise Lost">""" 或 "string1" + "string2" 另请参阅字符串。 |
字节 | 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
备注
函数不能用于计算 [<Literal>]
值,因为文本必须在编译时确定,并且不能依赖于运行时计算。
[<Literal>]
属性要求在编译时知道值。 函数即使看似生成常量输出,也是在运行时计算的,因此不适合 [<Literal>]
。 此限制可确保在模式匹配、属性参数以及与外部函数互操作等方案中安全地使用文本。
例如,尝试将函数的结果分配给文本将失败:
[<Literal>]
let yFunc() = "a" + "b" // error FS0267: this is not a valid constant expression
调用 外部函数时,这种区别也很重要。 例如,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
子句或其他逻辑,使模式匹配更加简洁。 例如:
[<Literal>]
let ErrorCode = 404
let handleResponse code =
match code with
| ErrorCode -> "Not Found"
| _ -> "Other Response"
命名文本适用于:
- 不带
when
子句的模式匹配。 - 属性参数。
- 静态类型提供器参数。
Unicode 字符串可以包含显式编码或 UTF-32 编码,前者可以使用 \u
后跟 16 位十六进制代码 (0000 - FFFF) 来指定,后者可以使用 \U
后跟代表任何 Unicode 码位的 32 位十六进制代码 (00000000 - 0010FFFF) 来指定。
不允许使用除 |||
以外的按位运算符。
还可以分别使用 0x
、0o
或 0b
前缀在十六进制、八进制或二进制中指定带符号 32 位整数。
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