F# - 字符串


在 F# 中,字符串类型将不可变文本表示为 Unicode 字符序列。

字符串文字

字符串文字由引号 (") 字符分隔。

一些特殊字符用于特殊用途,例如换行符、制表符等。它们使用反斜杠 (\) 字符进行编码。反斜杠字符和相关字符构成转义序列。下表显示了 F# 支持的转义序列。

特点 转义序列
退格键 \b
新队 \n
回车符 \r
标签 \t
反斜杠 \\
引号 \"
撇号 \'
统一码字符 \uXXXX 或 \UXXXXXXXX(其中 X 表示十六进制数字)

忽略转义序列的方法

以下两种方法使编译器忽略转义序列 -

  • 使用@符号。
  • 将字符串括在三引号中。

当字符串文字前面带有 @ 符号时,它称为逐字字符串。这样,字符串中的所有转义序列都会被忽略,除了两个引号字符被解释为一个引号字符之外。

当字符串用三引号括起来时,所有转义序列也会被忽略,包括双引号字符。

例子

以下示例演示了此技术,展示了如何使用 XML 或包含嵌入引号的其他结构 -

// Using a verbatim string
let xmldata = @"<book author = ""Lewis, C.S"" title = ""Narnia"">"
printfn "%s" xmldata

当您编译并执行该程序时,它会产生以下输出 -

<book author = "Lewis, C.S" title = "Narnia">

字符串的基本运算符

下表显示了字符串的基本操作 -

价值 描述
收集:(字符→字符串)→字符串→字符串 创建一个新字符串,其字符是将指定函数应用于输入字符串的每个字符并连接结果字符串的结果。
concat : 字符串 → seq<字符串> → 字符串 返回通过将给定字符串与分隔符连接而成的新字符串。
存在:(字符→布尔)→字符串→布尔 测试字符串的任何字符是否满足给定的谓词。
forall : (字符 → 布尔值) → 字符串 → 布尔值 测试字符串中的所有字符是否满足给定的谓词。
init : int → (int → string) → string 创建一个新字符串,其字符是将指定函数应用于每个索引并连接结果字符串的结果。
iter : (字符 → 单位) → 字符串 → 单位 将指定的函数应用于字符串中的每个字符。
iteri : (int → char → 单位) → 字符串 → 单位 将指定的函数应用于字符串中每个字符的索引以及字符本身。
长度:字符串 → 整数 返回字符串的长度。
映射:(字符→字符)→字符串→字符串 创建一个新字符串,其字符是将指定函数应用于输入字符串的每个字符的结果。
mapi : (int → char → char) → 字符串 → 字符串 创建一个新字符串,其字符是将指定函数应用于输入字符串的每个字符和索引的结果。
复制:整数→字符串→字符串 通过连接指定数量的字符串实例返回一个字符串。

以下示例演示了上述一些功能的用法 -

实施例1

String.collect 函数构建一个新字符串,其字符是将指定函数应用于输入字符串的每个字符并连接结果字符串的结果。

let collectTesting inputS =
   String.collect (fun c -> sprintf "%c " c) inputS
printfn "%s" (collectTesting "Happy New Year!")

当您编译并执行该程序时,它会产生以下输出 -

H a p p y N e w Y e a r !

实施例2

String.concat 函数将给定的字符串序列与分隔符连接起来并返回一个新字符串。

let strings = [ "Tutorials Point"; "Coding Ground"; "Absolute Classes" ]
let ourProducts = String.concat "\n" strings
printfn "%s" ourProducts

当您编译并执行该程序时,它会产生以下输出 -

Tutorials Point
Coding Ground
Absolute Classes

实施例3

String.replicate 方法通过连接指定数量的字符串实例来返回字符串。

printfn "%s" <| String.replicate 10 "*! "

当您编译并执行该程序时,它会产生以下输出 -

*! *! *! *! *! *! *! *! *! *!