【PL理论】(6) F#:标准库之列表(List)

​​​​​

  • **💭 写在前面:**本章我们将介绍 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]. |

相关推荐
CV工程师小林44 分钟前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
Navigator_Z1 小时前
数据结构C //线性表(链表)ADT结构及相关函数
c语言·数据结构·算法·链表
还听珊瑚海吗1 小时前
数据结构—栈和队列
数据结构
Aic山鱼1 小时前
【如何高效学习数据结构:构建编程的坚实基石】
数据结构·学习·算法
sjsjs112 小时前
【数据结构-一维差分】力扣1893. 检查是否区域内所有整数都被覆盖
数据结构·算法·leetcode
Lzc7742 小时前
堆+堆排序+topK问题
数据结构·
cleveryuoyuo2 小时前
二叉树的链式结构和递归程序的递归流程图
c语言·数据结构·流程图
湫兮之风3 小时前
c++:tinyxml2如何存储二叉树
开发语言·数据结构·c++
zhyhgx4 小时前
【算法专场】分治(上)
数据结构·算法
Joeysoda4 小时前
Java数据结构 时间复杂度和空间复杂度
java·开发语言·jvm·数据结构·学习·算法