- **💭 写在前面:**本章我们将介绍 F# 标准库的列表,我们将简单的先过一遍列表的一些常用操作,具体的讲解我们将放在后续章节。
目录
[0x00 标准库:列表(List)](#0x00 标准库:列表(List))
[0x01 模式匹配与列表](#0x01 模式匹配与列表)
[0x02 列表拼接(@ 和 List.append)](#0x02 列表拼接(@ 和 List.append))
[0x03 过滤列表(List.filter)](#0x03 过滤列表(List.filter))
[0x04 映射列表(List.map)](#0x04 映射列表(List.map))
[0x05 折叠列表(List.fold)](#0x05 折叠列表(List.fold))
[0x06 反转列表(List.rev)](#0x06 反转列表(List.rev))
0x00 标准库:列表(List)
这是库支持的一种流行的数据结构,列表中的元素必须具有相同的类型。
像 List.length 这样的函数是多态的,可以用于整数列表和字符串列表(类似于 C++ 模板)。
类型可以用两种方式表示:int list 或者 List<int>
cpp
int list
List<int>
💬 代码演示:
cpp
let lst1: int list = [1; 2; 3; 4]
let lst2: List<string> = ["F#"; "OCaml"; "Scala"]
let len1: int = List.length lst1
let len2: int = List.length lst2
let b: bool = List.contains 5 lst1 // returns false
let s: string = List.head lst2 // returns "F#"
0x01 模式匹配与列表
实际上,列表类型也是归纳定义的。
- 基本情况:一个空列表
- 归纳情况:一个元素被添加到现有列表的前面
实际上 ,我们可以使用模式匹配和递归计算许多事情。
bash
// 在类型注解中,'a 表示任意类型
let rec length (lst: List<'a>) : int =
match lst with
| [] -> 0
| head :: tail -> 1 + (length tail)
let rec contains (e: 'a) (lst: List<'a>) : bool =
match lst with
| [] -> false
| head :: tail -> (head = e) || contains e tail
注意,这里有几个常见错误!首先, 表示将一个元素添加到一个列表的前面。
另一个常见的错误是使用 , 而不是 ; ,它会被识别为元组列表。
0x02 列表拼接(@ 和 List.append)
如果你想要连接两个列表可以使用艾特符号 @ 拼接,使用
bash
lst1 @ lst2
也可以使用 List.append() 拼接两个列表:
cpp
// 定义更多示例列表
let lst3: int list = [5; 6; 7]
let lst4: int list = [8; 9; 10]
// 列表拼接
let lst5: int list = lst1 @ lst3 // [1; 2; 3; 4; 5; 6; 7]
// 使用 List.append 进行拼接
let lst6: int list = List.append lst1 lst4 // [1; 2; 3; 4; 8; 9; 10]
0x03 过滤列表(List.filter)
在 F# 中,过滤列表(Filtering a List)是指从列表中提取满足某个条件的元素,形成一个新的列表,可以使用 List.filter 函数来完成。
💬 举个例子: 元素的过滤可以用 List.filter,函数过滤出列表中所有的偶数:
cpp
let lst3: int list = [5; 6; 7]
let lst4: int list = [8; 9; 10]
// 过滤列表中的元素
let evenNumbers: int list = List.filter (fun x -> x % 2 = 0) lst1 // [2; 4]
具体的操作我们会在接下来的章节详细讲解一下。
0x04 映射列表(List.map)
使用 List.map 函数将列表中的每个元素平方
cpp
let lst3: int list = [5; 6; 7]
let lst4: int list = [8; 9; 10]
// 映射列表中的元素
let squares: int list = List.map (fun x -> x * x) lst1 // [1; 4; 9; 16]
0x05 折叠列表(List.fold)
使用 List.fold 函数计算列表中所有元素的和
cpp
let lst3: int list = [5; 6; 7]
let lst4: int list = [8; 9; 10]
// 折叠列表,计算元素之和
let sum: int = List.fold (fun acc x -> acc + x) 0 lst1 // 10
0x06 反转列表(List.rev)
使用 List.rev 函数反转列表
cpp
let lst3: int list = [5; 6; 7]
let lst4: int list = [8; 9; 10]
// 反转列表
let reversedLst1: int list = List.rev lst1 // [4; 3; 2; 1]
cpp
📌 [ 笔者 ] 王亦优
📃 [ 更新 ] 2024.6.5
❌ [ 勘误 ] /* 暂无 */
📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,
本人也很想知道这些错误,恳望读者批评指正!
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 📜 参考资料 C++reference[EB/OL]. []. http://www.cplusplus.com/reference/. Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. . 百度百科[EB/OL]. []. https://baike.baidu.com/. 比特科技. C++[EB/OL]. 2021[2021.8.31]. |