使用英语阅读

通过


文本

本文提供了一个表,该表展示了如何指定 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.14F4.14finfinityf-infinityf
lf 0x00000000lf
float; double 64 位浮点数 没有 4.142.3E+322.3e+32infinity-infinity
LF 0x0000000000000000LF
bigint 整数不限于 64 位表示形式 9999999999999999999999999999I
十进制 分数表示为定点数或有理数 M 或 m 0.7833M0.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 属性标记旨在成为常量的值。

此属性具有导致将值编译为常量的效果。 在以下示例中,下面的 xy 都是不可变值,但在运行时计算 x,而 y 是编译时常量。

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

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

备注

函数不能用于计算 [<Literal>] 值,因为文本必须在编译时确定,并且不能依赖于运行时计算。

为什么函数无法计算文本

[<Literal>] 属性要求在编译时知道值。 函数即使看似生成常量输出,也是在运行时计算的,因此不适合 [<Literal>]。 此限制可确保在模式匹配、属性参数以及与外部函数互操作等方案中安全地使用文本。

例如,尝试将函数的结果分配给文本将失败:

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

调用 外部函数时,这种区别也很重要。 例如,DllImport 是一个属性,需要在编译期间知道 myDLL 的值。 如果没有 [<Literal>] 声明,此代码将无法编译:

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

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

在模式匹配表达式中,以小写字符开头的标识符始终被视为要绑定的变量,而不是文本,因此在定义文本时,通常应使用初始大写。

F#
[<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 子句或其他逻辑,使模式匹配更加简洁。 例如:

F#
[<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) 来指定。

不允许使用除 ||| 以外的按位运算符。

其他基数中的整数

还可以分别使用 0x0o0b 前缀在十六进制、八进制或二进制中指定带符号 32 位整数。

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

数值文本中的下划线

可以使用下划线字符(_)分隔数字。

F#
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