【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++referenceEB/OL. \[\]. http://www.cplusplus.com/reference/. Microsoft. MSDN(Microsoft Developer Network)EB/OL. \[\]. . 百度百科EB/OL. \[\]. https://baike.baidu.com/. 比特科技. C++EB/OL. 20212021.8.31. |

相关推荐
青山木6 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
Livia要学习9 小时前
Python2和Python3字典底层原理
数据结构
青梅橘子皮10 小时前
STL---map/set... “家族“详解(从使用到底层)(1)
数据结构·算法
Adios79410 小时前
搜索二维矩阵 II
java·数据结构·算法
我命由我1234512 小时前
Java 开发 - List subList 方法
java·windows·操作系统·list·intellij-idea·idea·intellij idea
灵枢时代14 小时前
小程序在生鲜配送行业,如何设计夜间预约和次日达的订单处理流程?
数据结构·人工智能·小程序
一条大祥脚15 小时前
ABC468 扫描线|贡献法|二阶差分|线段树优化DP
数据结构·算法
mifengxing1 天前
LeetCode 189 轮转数组|3种解法拆解,从暴力到O(1)原地最优解
数据结构·算法·leetcode
MIngYaaa5201 天前
2026暑期牛客多校3 2026-7-24
数据结构·算法·000
2501_937860941 天前
Java 集合底层深度剖析:Map 与 Set、二叉搜索树、哈希表全解
java·数据结构·散列表