文本
本文提供了一个表,该表展示了如何指定 F# 中的文本类型。
文本类型
下表展示了 F# 中的文本类型。 以十六进制表示法表示数字的字符不区分大小写;标识类型的字符区分大小写。
类型 | 说明 | 后缀或前缀 | 示例 |
---|---|---|---|
sbyte | 有符号 8 位整数 | y | 86y 0b00000101y |
字节 | 无符号 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 |
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 位表示形式 | I | 9999999999999999999999999999I |
decimal | 表示为定点数或有理数的小数 | 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
例如,在调用外部函数时,这种区别很重要,因为 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 字符串可以包含显式编码或 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