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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Turnitin揭露AI写作痕迹,是否会影响论述是重复率?

Turnitin(www.checktoo.com)为学术界提供了便捷的服务,以确保论文的原创性和学术诚信。然而,许多学生和研究人员在使用Turnitin时,常常会想Turnitin查论文AI率和重复率之间的关系。那么,使用Turnitin查重论…

LeetCode-day04-2938. 区分黑球与白球

LeetCode-day04-2938. 区分黑球与白球 题目描述示例示例1:示例2: 思路代码 题目描述 桌子上有 n 个球,每个球的颜色不是黑色,就是白色。 给你一个长度为 n 、下标从 0 开始的二进制字符串 s,其中 1 和 0 分别代表黑色…

Centos7安装Zookeeper

Centos7安装Zookeeper 准备工作 https://zookeeper.apache.org/releases.html 下载稳定版的安装包。【注意:下载的是xxx-bin.tar.gz包 是可运行的zookeeper 而 xxx.tar.gz是源码包不可运行】 上传zookeeper的压缩包到指定目录/usr/local/zookeeper/ 安装Zookeepe…

从写简历到谈薪资的最全教程

从写简历到谈薪资的最全教程 目录简历注意事项举个例子写简历投递简历也有技巧模拟面试的重要性面试经验怎么刷不断迭代达越来越强斗智斗勇谈薪资拿到offer就结束了吗?我能给你的帮助 目录 大家好,我是一名普通本科毕业的学生,工作数年&#…

移动端 UI 风格,彰显品质

移动端 UI 风格,彰显品质

中子介程三

X$XFX$XqXyXqX$XFX$XqXyXqX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XyX$XpX$XyX$XyXeXαX$XqXyXqX$XαXeXyX$XyX$XpX$XyX$XhXαXeX$XηXqXαXpX$XWXyX$XyXWX$XαXtXηXαXpX$XEX$XZX$XpXαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XyX$XpX$XyX$XyXeXαX$XqXyXqX$X…

嵌入式学习——网络编程(UDP)——day30

1. 协议 通信双方约定的一套标准成为协议 2. 国际网络协议标准 2.1 OSI七层模型(理论模型) 应用层:传输的数据(a.out) 表示层:数据是否加密 会话层:是否需要建立会话链接(网络断开连接状态) …

shell 变量引用 ${}、$,传参 $1、$2,四则运算 $[]

变量引用 两种: ${变量名} $变量名 例如: filepath"/home/mytool" filename"t1.txt" 可以写成 echo "$filepath/$filename" 或者 echo "${filepath}/${filename}"打印结果: /home/mytool/t1.tx…

[力扣题解] 617. 合并二叉树

题目:617. 合并二叉树 思路 递归法遍历,随便一种遍历方式都可以,以前序遍历为例; 代码 class Solution { public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if(root1 NULL){return root2;}if(root2 NULL){r…

Java面试题:Redis数据过期策略

Redis数据过期策略 数据过期之后对数据进行删除的处理 惰性删除 每次需要该key时对key进行检查 如果过期就删除,反之就返回该key 对cpu友好,不用浪费时间进行过期检查 对内存不友好,如果key过期但没使用就会一直存在内存中不会释放 定期删除 每隔一段时间对一些key进行…

Linux软件安装以及网络请求和下载

目录 前言一、系统环境二、软件安装2.1 使用yum命令实现软件的自动化安装 三、网络请求和下载3.1 wget命令3.2 curl命令 总结 前言 本篇文章介绍如何在Linux系统上安装软件,以及如何发送网络请求并从网络下载文件。 一、系统环境 虚拟机版本:VMware W…

气膜乒乓球馆:新型体育设施的投资机遇—轻空间

乒乓球作为我国的国球,不仅在世界舞台上表现卓越,在国民的心目中也占有重要位置。随着科技的进步,气膜乒乓球馆作为一种新型体育设施,正逐渐走入大众视野,为乒乓球爱好者提供了一个舒适、安全、环保的运动场所。那么&a…

linux的编辑安装

yum remove 软件名 注意:yum安装自动解决各种依赖,安装位置固定不可改 编辑安装 安装源码包的过程: 1.解压源码包 2.进入解压目录 3.安装依赖 4.执行./configure 1)检查当前系统环境是否满足后续操作 2)指定软件…

Linux环境---在线安装MYSQL数据库

Linux环境—在线安装MYSQL数据库 一、使用步骤 1.安装环境 Mysql 驱动 8.0 需要 jdk1.8 才行。 JDK版本:1.8 参考文档 MYSQL版本:8.0.2 下载链接: https://pan.baidu.com/s/1MwXIilSL6EY3OuS7WtpySA?pwdg263 操作系统:CentOS 1.1 建立存…

【论文阅读】MODELING AND SOLVING THE TRAVELING SALESMAN PROBLEM WITH PRIORITY PRIZES

文章目录 论文基本信息摘要1.引言2. INTEGER QUADRATIC PROGRAM FOR TSPPP3. MIXED INTEGER LINEAR PROGRAMS FOR TSPPP4. TABU SEARCH ALGORITHM FOR TSPPP5. COMPUTATIONAL RESULTS6. CONCLUDING REMARKS补充 论文基本信息 《MODELING AND SOLVING THE TRAVELING SALESMAN P…

hadoop部署hive

1.安装mysql数据库 这里采用docker部署mysql,如果没有安装docker #安装yum工具 yum install -y yum-utils device-mapper-persistent-data lvm2 --skip-broken #设置docker镜像源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/…

搜索引擎优化服务如何寻找?

首先你要了解搜索引擎优化,也就是seo具体是什么,要做些什么,然后就是确定你自身业务的需求,是要特定的关键词排名,还是整体网站流量的提升,还是想要优化目前的网站 接下来你就可以正式的寻找真正能帮助到你…

图的相关种类

目录 数据类型 存储结构 邻接矩阵表示法 无向图 邻接矩阵表示 有向图 网 实现 邻接矩阵表示 存储结构 创建无向图 优点 缺点 邻接表法表示 表示无向图 表示有向图 存储结构 无向网 特点 十字链表与多重表 十字链表 存储结构 多重表 存储结构 数据类型 存…

SharePoint:智能内容管理,释放数据价值

在Microsoft 365的庞大生态系统中,SharePoint常常被忽视,但它却是整个平台的核心。SharePoint不仅承载着OneDrive、Teams、Power Platform等所有Microsoft 365产品的内容存储,更是企业协作和内容管理的基石。助AI技术的加持,Share…

VBA实战(Excel)(4):实用功能整理

1.后台打开Excel 用于查数据,工作中要打开多个表获取数据再关闭的场景,利用此函数可以将excel表格作为后台数据库查询,快速实现客户要求,缺点是运行效率不够高。 Sub openexcel(exl_name As String)If Dir(addr, 16) Empty Then…