【PL理论】(8) F#:列表高阶函数之 filter 函数 | 内联谓词函数 | 链式操作:先过滤再映射

  • ???? 写在前面:上一章中,我们详细讲解了列表的合并,本章我们来详细讲解一下列表的过滤,在 F# 中,过滤列表是指从列表中提取满足某个条件的元素,形成一个新的列表。这个操作通常使用 List.filter 函数来完成。

目录

0x00 filter 函数介绍

0x01 内联谓词函数

0x02 链式操作:先过滤再映射


0x00 filter 函数介绍

List.filter 是一个高阶函数,它接受一个谓词函数和一个列表作为参数,并返回一个新的列表。

该列表包含所有满足谓词函数条件的元素,函数签名如下:

List.filter : ('T -> bool) -> 'T list -> 'T list
  • 'T -> bool 是一个谓词函数,它接受一个类型为 'T 的元素并返回一个 bool
  • 'T list 是输入列表
  • 返回值 'T list 是包含所有满足谓词函数条件的元素的新列表

???? 举个例子:假设我们有一个整数列表,我们想要提取所有的偶数:

let numbers = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]

// 定义一个谓词函数,判断一个数是否为偶数
let isEven x = x % 2 = 0

// 使用 List.filter 过滤列表,得到所有偶数
let evenNumbers = List.filter isEven numbers

printfn "偶数: %A" evenNumbers

???? 运行结果: 偶数:[2; 4; 6; 8; 10]

再举个例子,过滤所有大于 5 的数:

let numbers = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]

// 过滤出大于 5 的数
let greaterThanFive = List.filter (fun x -> x > 5) numbers

printfn "大于5的数: %A" greaterThanFive

???? 运行结果:大于5的数:[6; 7; 8; 9; 10]

过滤长大于 3 的字符串:

let words = ["F#"; "OCaml"; "Scala"; "Haskell"; "Python"]

// 过滤出长度大于 3 的字符串
let longWords = List.filter (fun s -> String.length s > 3) words

printfn "长度大于3的字符串:%A" longWords

???? 运行结果:长度大于3的字符串:["OCaml"; "Scala"; "Haskell"; "Python"]

0x01 内联谓词函数

我们可以直接在 filter 函数调用中,内联定义谓词函数,而不需要单独定义:

let numbers = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]

// 使用内联谓词函数
let evenNumbers = List.filter (fun x -> x % 2 = 0) numbers

printfn "偶数: %A" evenNumbers

0x02 链式操作:先过滤再映射

在 F# 中,我们可以将多个列表操作链式组合,例如先过滤再映射。

???? 举个例子:先过滤出偶数,再将他们开二次方

let numbers = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]

// 先过滤出偶数,然后将它们平方
let evenSquares = 
    numbers
    |> List.filter (fun x -> x % 2 = 0)
    |> List.map (fun x -> x * x)

printfn "偶数的平方: %A" evenSquares

???? 运行结果:偶数的平方: [4; 16; 36; 64; 100]

filter 函数会遍历整个列表,时间复杂度为 O(n),其中 n 是列表长度。


???? [ 笔者 ]   王亦优
???? [ 更新 ]   2024.6.5
❌ [ 勘误 ]   /* 暂无 */
???? [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

???? 参考资料 

C++reference[EB/OL]. []. http://www.cplusplus.com/reference/.

上一篇:二百三十九、Hive——Hive函数全篇


下一篇:YOLOv9改进策略 | Conv篇 | 利用YOLOv10提出的SCDown魔改YOLOv9进行下采样(附代码 + 结构图 + 添加教程)