Haskell 的高阶函数(Higher-order functions)
本节继续介绍Haskell的知识,本节内容介绍的是高阶函数(Higher-order functions)的概念和应用。高阶函数是指能够接受其他函数作为参数,或者返回函数作为结果的函数。
-
Functions as values(函数作为值):这指的是将函数本身作为数值一样进行处理,可以将函数赋值给变量。例如,
v = (\x -> x+x)
将一个匿名函数赋值给变量 v。 -
Functions as arguments(函数作为参数):这表明函数可以作为另一个函数的参数传递给函数。例如,
map f list
中的map
函数接受一个函数f
和一个列表list
作为参数。 -
List aggregation(列表聚合):这指的是利用高阶函数来对列表中的元素进行聚合操作,例如
foldr f v list
,其中foldr
是一个将列表从右向左折叠的函数,f
是一个聚合函数,v
是初始值。 -
Composition(函数组合):函数组合是指将一个函数的输出作为另一个函数的输入。例如,
f . g x = f (g x)
表示将函数g
的输出作为函数f
的输入。 -
Returning function values(返回函数值):这指的是函数可以作为其它函数的返回值。例如,
f . g
表示将函数g
的结果作为函数f
的输入,而f
本身也是一个函数。
一、Functions as values(函数作为值):
在 Haskell 中,函数是一等公民,可以像任何其他值一样被操作。例如:
double :: Int -> Int
double x = x + x-- 将函数赋值给变量
v :: Int -> Int
v = double
二、Functions as arguments(函数作为参数):
在 Haskell 中,函数可以作为参数传递给其他函数。例如,map
函数接受一个函数和一个列表,并将该函数应用于列表中的每个元素:
-- 定义一个函数
square :: Int -> Int
square x = x * x-- 使用函数作为参数调用 map
squares :: [Int] -> [Int]
squares = map square
三、List aggregation(列表聚合):
Haskell 提供了 foldr
和 foldl
等函数来对列表进行聚合操作。例如,使用 foldr
对列表求和:
-- 使用 foldr 对列表求和
sumList :: [Int] -> Int
sumList = foldr (+) 0
四、Composition(函数组合):
函数组合是 Haskell 中非常常见的操作,可以使用 .
运算符来组合两个函数:
-- 函数组合示例
composedFunction :: Int -> Int
composedFunction = square . double
五、Returning function values(返回函数值):
在 Haskell 中,函数也可以作为结果返回。例如,compose
函数接受两个函数作为参数,并返回它们的组合:
-- 返回函数的函数
compose :: (b -> c) -> (a -> b) -> a -> c
compose f g x = f (g x)
六、High-order function的常见使用
谈到 Haskell 中的高阶函数时,map
、filter
和 foldr
是其中最为常见和有用的函数之一。
-
map
:map
函数接受一个函数和一个列表作为参数,然后将该函数应用于列表中的每个元素,并返回应用后的新列表。通常用于对列表中的每个元素进行转换或映射操作-- 定义一个函数,将列表中的每个元素加倍 double :: Int -> Int double x = x * 2-- 使用 map 将 double 函数应用于列表中的每个元素 mappedList = map double [1, 2, 3, 4, 5] -- 结果为 [2, 4, 6, 8, 10]
-
filter
:filter
函数接受一个谓词函数(predicate function)和一个列表作为参数,然后返回满足谓词条件的元素组成的新列表。通常用于从列表中筛选出满足特定条件的元素-- 定义一个函数,用于判断一个数字是否为偶数 isEven :: Int -> Bool isEven x = x `mod` 2 == 0-- 使用 filter 筛选出列表中的偶数 filteredList = filter isEven [1, 2, 3, 4, 5] -- 结果为 [2, 4]
-
foldr
:foldr
函数接受一个二元操作函数、一个初始值和一个列表作为参数,然后将该操作函数应用于列表中的每个元素,从右向左地将列表折叠成单一的值,通常用于对列表中的元素进行聚合操作。-- 定义一个二元操作函数,用于计算列表中所有元素的和 add :: Int -> Int -> Int add x y = x + y-- 使用 foldr 计算列表中所有元素的和 sumOfList = foldr add 0 [1, 2, 3, 4, 5] -- 结果为 15
foldr
是 Haskell 中的一个高阶函数,它的作用是将一个二元操作函数以及一个初始值应用到列表的每个元素上,从右向左地将列表折叠成单一的值。它可以替代一些递归操作,尤其是涉及到列表处理的递归。在 Haskell 中,列表通常用递归的方式来处理。例如,我们可以使用递归来计算列表中所有元素的和:
sumList :: [Int] -> Int sumList [] = 0 sumList (x:xs) = x + sumList xs
然而,使用
foldr
函数,我们可以用更简洁的方式来实现相同的功能:sumList :: [Int] -> Int sumList = foldr (+) 0
这里的
foldr (+) 0
表示对列表中的每个元素应用+
函数,并从右向左地将它们加起来,初始值为0
。这样就不再需要显式地使用递归来处理列表了。foldr
的一般形式为:foldr :: (a -> b -> b) -> b -> [a] -> b
其中,
(a -> b -> b)
是一个二元操作函数,b
是初始值,[a]
是待折叠的列表。因此,
foldr
的作用在于将列表的处理抽象出来,通过提供一个合适的二元操作函数和初始值,可以很方便地对列表进行各种操作,而无需显式地使用递归。
相关文章:
Haskell 的高阶函数(Higher-order functions)
本节继续介绍Haskell的知识,本节内容介绍的是高阶函数(Higher-order functions)的概念和应用。高阶函数是指能够接受其他函数作为参数,或者返回函数作为结果的函数。 Functions as values(函数作为值)&…...
Unity websocket客户端
🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎目标:服务器和客户端可以实时的传输信息 ☀️实现目标: 使用的w…...

每日一题——博弈论(枚举与暴力)
博弈论 题目描述 运行代码 #include<iostream> #include<vector> using namespace std; int main(){int n;cin >> n;vector<int> d(n,0);for(int i 0;i < n;i){cin >> d[i];}vector<int> in(1000,0);for(int k 1;k<3;k){for(int…...

pytorch笔记:torch.nn.Flatten()
1 介绍 torch.nn.Flatten(start_dim1, end_dim-1) 将一个连续的维度范围扁平化为一个张量 start_dim (int)要开始扁平化的第一个维度(默认值 1)end_dim (int)要结束扁平化的最后一个维度(默认值 -1) 2 举例 input torch.ra…...

一个人应该怎么操作抖音小店呢?店铺操作流程给你讲解清楚!
大家好,我是电商小V 现在入驻抖音小店的有很多新手,新手最关心的就是一个人应该如何操作抖音小店,操作抖音小店需要做好哪几步呢?关于这个问题咱们就来详细的讲解一下, 第一点:开店 开店是做店的第一步&…...

“等保测评与安全运维的协同:保障企业网络安宁
"等保测评与安全运维的协同:保障企业网络安宁"是一个涉及信息安全领域的重要话题。这里,我们可以从几个方面来探讨这个主题。 1. 等保测评(等级保护测评) 等保测评,即信息安全等级保护测评,是依…...

python抽取pdf中的参考文献
想将一份 pdf 论文中的所有参考文献都提取出来,去掉不必要的换行,放入一个 text 文件,方便复制。其引用是 ieee 格式的,形如: 想要只在引用序号(如 [3])前换行,其它换行都去掉&…...

Java进阶学习笔记21——泛型概念、泛型类、泛型接口
泛型: 定义类、接口、方法的时候,同时声明了一个或者多个类型变量(如: <E>),称之为泛型类、泛型接口、泛型方法,我们统称之为泛型。 说明这是一个泛型类。 如果不使用泛型,我们可以往ArrayList中传…...
第二天-⑦前后端需要注意的事项
①防xss跨站脚本攻击...
Socket 函数详细讲解(Socket编程步骤、socket函数、TCP和UDP的区别)
Socket 函数详细讲解和 C 示例 一、 Socket 基本概念1. Socket 简介2. Socket 编程步骤3. TCP Socket 编程示例服务器端客户端 4. 详细说明 二、 socket 函数1. domain 通讯的协议家族2. type 数据传输的类型3. protocol 最终使用的协议返回值示例 三、TCP 和 UDP的区别1. TCP&…...

【限免】杂波环境下线性调频脉冲、巴克码、频率步进脉冲雷达MTI、脉冲压缩【附MATLAB代码】
来源:微信公众号:EW Frontier 本代码主要模拟杂波环境(飞机、地杂波、鸟类信号)下,Chirp脉冲、巴克码脉冲、频率步进脉冲雷达信号的脉冲压缩及MTI、匹配滤波。 MATLAB主代码 % 定义参数 fs 1000; % 采样率 T 1; …...
前端最新面试题(Javascript模块篇)
目录 1 数据类型基础 1.1 JS内置类型 1.2 null和undefined区别 1.3 null是对象吗?为什么? 1.4 1.toString()为什么可以调用? 1.5 0.1+0.2为什么不等于0.3?如何让其相等 1.6 如何理解BigInt 1.7 JS 整数是怎么表示的 1.8 Number() 的存储空间是多大?如果后台发送了…...

Android11热点启动和关闭
Android官方关于Wi-Fi Hotspot (Soft AP) 的文章:https://source.android.com/docs/core/connect/wifi-softap?hlzh-cn 在 Android 11 的WifiManager类中有一套系统 API 可以控制热点的开和关,代码如下: 开启热点: // SoftApC…...

DI-engine强化学习入门(三)DI-ZOO强化学习环境搭建与示例运行——Atari
Atari是一家知名的电子游戏公司,成立于1972年,是早期电子游戏产业的先驱之一。在强化学习领域,提到Atari通常指的是Atari 2600游戏的一系列环境,这些环境是用于开发和测试强化学习算法的标准平台。 Atari 2600 强化学习环境概述 …...
【一站式学会Kotlin】第十节:kotlin 语言的可控性特点和安全调用操作符
作者介绍: 百度资深Android工程师T6,在百度任职7年半。 目前:成立赵小灰代码工作室,欢迎大家找我交流Android、微信小程序、鸿蒙项目。= 一:通俗易懂的人工智能教程:https://www.captainbed.cn/nefu/ 点一下,打开新世界的大门。 二:【一站式学会Kotlin】免费领取:作者…...
PaddleClas 指定gpu
在使用PaddleClas进行模型训练或预测时,如果您想要指定使用特定的GPU设备,可以通过CUDA_VISIBLE_DEVICES环境变量来设置。 在命令行中设置GPU的方法如下: # 指定第0号GPU export CUDA_VISIBLE_DEVICES0 # 之后运行PaddleClas的命令…...

langchain进阶一:特殊的chain,轻松实现对话,与数据库操作,抽取数据,以及基于本地知识库的问答
特殊的chain langchain中的Chain有很多,能够轻松实现部分需求,极致简化代码,但是实现效果与模型智慧程度有关 会话链 效果与LLMChain大致相同 javascript 复制代码 from langchain.chains import ConversationChain from langchain_community.llms import OpenAI conversat…...

【Spring Boot】响应式编程
响应式编程 1.WebFlux2.比较 MVC 和 WebFlux2.1 工作方式2.2 Spring MVC 与 Spring WebFlux 的区别2.3 使用 WebFlux 的好处 3.Mono 和 Flux3.1 Mono 和 Flux 是什么3.2 Mono 和 Flux 的区别 4.开发 WebFlux 的流程4.1 注解式开发流程4.2 响应式开发流程 5.用注解式开发实现 He…...

【C++练级之路】【Lv.21】C++11——列表初始化和声明
快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、列表初始化1.1 内置类型1.2 结构体或类1.3 容器 二、声明2.1 auto2.2 decltype2.3 nullptr 三、STL的…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...