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

发布于:2024-06-10 ⋅ 阅读:(128) ⋅ 点赞:(0)

  ​​​​​

  • 💭 写在前面:本章我们将介绍 F# 标准库的列表,我们将简单的先过一遍列表的一些常用操作,具体的讲解我们将放在后续章节。

目录

0x00 标准库:列表(List)

0x01 模式匹配与列表

0x02 列表拼接(@ 和 List.append)

0x03 过滤列表(List.filter)

0x04 映射列表(List.map)

0x05 折叠列表(List.fold)

0x06 反转列表(List.rev)


0x00 标准库:列表(List)

这是库支持的一种流行的数据结构,列表中的元素必须具有相同的类型。

像 List.length 这样的函数是多态的,可以用于整数列表和字符串列表(类似于 C++ 模板)。

类型可以用两种方式表示:int list 或者 List<int>

int list
List<int>

💬 代码演示:

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 模式匹配与列表

实际上,列表类型也是归纳定义的。

  • 基本情况:一个空列表 [\, ]
  • 归纳情况:一个元素被添加到现有列表的前面 e::lst

实际上  [1;2;3]\, \equiv \, 1 :: (2 :: (3 :: [])) ,我们可以使用模式匹配和递归计算许多事情。

// 在类型注解中,'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

注意,这里有几个常见错误!首先,e::lst 表示将一个元素添加到一个列表的前面。

另一个常见的错误是使用 , 而不是 ;   ,它会被识别为元组列表。

0x02 列表拼接(@ 和 List.append)

如果你想要连接两个列表可以使用艾特符号 @ 拼接,使用 lst1\, @\, lst2

lst1 @ lst2

也可以使用 List.append() 拼接两个列表:

// 定义更多示例列表
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,函数过滤出列表中所有的偶数:

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 函数将列表中的每个元素平方

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 函数计算列表中所有元素的和

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 函数反转列表

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]


📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   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]. 


网站公告

今日签到

点亮在社区的每一天
去签到