当前位置: 首页> 游戏> 网游 > 【PL理论】(8) F#:列表高阶函数之 filter 函数 | 内联谓词函数 | 链式操作:先过滤再映射

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

时间:2025/7/29 14:15:58来源:https://blog.csdn.net/weixin_50502862/article/details/139485668 浏览次数:1次

  • 💭 写在前面:上一章中,我们详细讲解了列表的合并,本章我们来详细讲解一下列表的过滤,在 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 numbersprintfn "偶数: %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) numbersprintfn "大于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) wordsprintfn "长度大于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) numbersprintfn "偶数: %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/.

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: