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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超详解——Python模块文档——小白篇

目录 1. Unix起始行 示例: 2. 对象和类型 示例: 3. 一切都是对象 示例: 4. 理解对象和引用 示例: 5. 理解对象和类型 示例: 6. 标准类型 示例: 7. 其他内建类型 示例: 8. 类型的类…

HTML静态网页成品作业(HTML+CSS)—— 保护环境环保介绍网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

基于zyyo主页与無名の主页合并二改,一款适合新手的个人主页

pengzi主页🙋 项目地址 简洁的布局:主页应该有清晰的布局,包括一个简洁的导航菜单和易于浏览的内容区域。避免使用过多的花哨效果,保持页面简洁明了。 个人资料介绍:在主页上展示一段简短的个人介绍,包括…

bat脚本简介

一、bat脚本 概念定义 BAT 批处理是一种在 Windows 系统中用于将一系列命令组合成一个可执行文件(.bat 文件)的脚本技术。 允许用户将多个操作命令按顺序编写在一起。形成一个自动化执行的流程。批处理文件可以包含各种系统命令和程序调用。 如文件操作…

STM32_HAL库_外部中断

一、设置分组 stm32f1xx_hal_cortex.c 查看分组 五个形参,分组0~4 stm32f1xx_hal.c 设置了分组为2, 此工程就不需要再设置了 再回到stm32f1xx_hal_cortex.c 查看NVIC_SetPriorityGrouping的定义,若无法跳转,先编译一下&…

海外电商平台的开发对接

对接海外第三方电商平台是一个复杂但至关重要的过程,尤其是对于那些希望在全球市场拓展业务的跨境电商企业。以下是对接海外电商平台的一般步骤和技术要点。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 平台选择 确…

最新 HUAWEI DevEco Studio 使用技巧

最新 HUAWEI DevEco Studio 使用技巧 HUAWEI DevEco Studio 作为我们 harmonyos 应用的开发工具,有必要好好打磨一下。 Chinese(Simplified) 中文汉化插件 GitToolBox 编辑器中显示git历史 保存时自动格式化 写了一堆代码,当保存时,自动帮…

【docker】centos7配置docker镜像阿里云加速

国内从 DockerHub 拉取镜像有时会遇到困难,由于网络原因,下载一个Docker官方镜像可能会需要很长的时间,甚至下载失败。此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务。 测试了几次阿里云的加速是最快的。 …

安装 JDK 17

安装包 百度网盘 提取码:6666 安装步骤 双击下载得到的安装包,开始安装: 正在安装: 安装完成: 安装路径下,多出来了很多新的内容。安装文件夹所包含的内容及作用: src 是 JDK 的源码包。类库…

go语言后端开发学习(二)——基于七牛云实现的资源上传模块

前言 在之前的文章中我介绍过我们基于gin框架怎么实现本地上传图片和文本这类的文件资源(具体文章可以参考gin框架学习笔记(二) ——相关数据与文件的响应),但是在我们实际上的项目开发中一般却是不会使用本地上传资源的方式来上传的,因为文件的上传与读…

初级软件测试快速入门

文章目录 初级软件测试-测试用例、缺陷报告的认识与使用软件测试简介测试分类模型质量模型测试模型 用例编写的八大要素用例设计方法缺陷 初级软件测试-测试用例、缺陷报告的认识与使用 软件测试简介 什么是软件测试? 使用技术手段验证软件是否满足需求 主流技能 …

【香橙派】Orange Pi AIpro体验——国产AI赋能

文章目录 🍔开箱🛸烧录镜像⭐启动系统🎈本机登录🎈远程登陆 🎆AI功能体验🔎总结 🍔开箱 可以看到是很精美的开发组件 这里是香橙派官网 http://www.orangepi.cn/ 我们找到下面图片的内容&#…

BC9 printf的返回值

BC9 printf的返回值 这里我们先要了解库函数printf printf的返回值&#xff0c;是写入的字符总数 我们第一遍写代码时候可能写成这样: #include<stdio.h> int main() {int retprintf("Hello world!");printf("%d", ret);return 0; }我们发现这样是通…

【Python爬虫单点登录实战】PyExecJS破解慧职教:过河源技术学院单点登录统一身份认证

目录 前言大致分析PyExecJS 使用案例pip 安装:Demo:输出:案例1.访问目标网站的登录页面并查看源码2.将js放到和py脚本同一级目录下3. 编写Python脚本来调用js破解单点登录实战提取密钥参数清洗数据登陆测试单点登录获取ticket获取jsessionid获取token成功我的专栏前言 博主提供…

Day12:rem 布局 和 less 使用

目标&#xff1a;使用 rem 和 less 完成移动端的布局。 一、移动 Web 基础 1、谷歌模拟器 在网页右键点“检查”或快捷键 F12&#xff0c;然后右边栏顶部第二个按钮切换设备为移动端&#xff0c;刷新网页&#xff0c;可以看到谷歌模拟器&#xff0c;可以切换模拟器型号、尺寸…

2024高考作文引发的人工智能争议

又是一年高考季&#xff0c;多少学子的修行成果也在这这一刻迎来了终极检验&#xff0c;多少学子的梦也在这一刻拉开了揭晓序幕&#xff0c;多少学习的命运也在这一刻迎来了人生中的第一次转变。每年的高考不仅是学子们的人生大事&#xff0c;也是多少父母的热切期望&#xff0…

[office] excel怎么设置图表格式- excel中chart tools的使用方法 #笔记#经验分享#其他

excel怎么设置图表格式? excel中chart tools的使用方法 excel怎么设置图表格式&#xff1f;excel中的数据可以制作成图表&#xff0c;在出啊如图表以后可以再图表总使用命令对其格式进行设置&#xff0c;下面我们就来看看excel中chart tools的使用方法&#xff0c;需要的朋友可…

运维 之 DNS域名解析

前言 我们每天打开的网站&#xff0c;他是如何来解析&#xff0c;并且我们怎么能得到网站的内容反馈的界面呢&#xff1f;那什么是DNS呢&#xff08;DNS&#xff08;DomainNameservice&#xff0c;域名服务&#xff0c;主要用于因特网上作为域名和IP地址相互映射&#xff09;那…

计算机网络--传输层

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 1. 概述 1.1 传输层的意义 网络层可以把数据从一个主机传送到另一个主机&#xff0c;但是没有和进程建立联系。 传输层就是讲进程和…