【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]. |

相关推荐
1nullptr1 小时前
三次翻转实现数组元素的旋转
数据结构
TT哇1 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
A懿轩A2 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
1 9 J3 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
汝即来归3 小时前
选择排序和冒泡排序;MySQL架构
数据结构·算法·排序算法
aaasssdddd966 小时前
C++的封装(十四):《设计模式》这本书
数据结构·c++·设计模式
芳菲菲其弥章6 小时前
数据结构经典算法总复习(下卷)
数据结构·算法
yyyyyyykk6 小时前
数据结构--链表
数据结构·链表
我是一只来自东方的鸭.7 小时前
1. K11504 天平[Not so Mobile,UVa839]
数据结构·b树·算法
武昌库里写JAVA7 小时前
使用React Strict DOM改善React生态系统
数据结构·vue.js·spring boot·算法·课程设计