当前位置: 首页 > news >正文

Haskell 的高阶函数(Higher-order functions)

本节继续介绍Haskell的知识,本节内容介绍的是高阶函数(Higher-order functions)的概念和应用。高阶函数是指能够接受其他函数作为参数,或者返回函数作为结果的函数。

  1. Functions as values(函数作为值):这指的是将函数本身作为数值一样进行处理,可以将函数赋值给变量。例如,v = (\x -> x+x) 将一个匿名函数赋值给变量 v。

  2. Functions as arguments(函数作为参数):这表明函数可以作为另一个函数的参数传递给函数。例如,map f list 中的 map 函数接受一个函数 f 和一个列表 list 作为参数。

  3. List aggregation(列表聚合):这指的是利用高阶函数来对列表中的元素进行聚合操作,例如 foldr f v list,其中 foldr 是一个将列表从右向左折叠的函数,f 是一个聚合函数,v 是初始值。

  4. Composition(函数组合):函数组合是指将一个函数的输出作为另一个函数的输入。例如,f . g x = f (g x) 表示将函数 g 的输出作为函数 f 的输入。

  5. 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 提供了 foldrfoldl 等函数来对列表进行聚合操作。例如,使用 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 中的高阶函数时,mapfilterfoldr 是其中最为常见和有用的函数之一。

  1. mapmap 函数接受一个函数和一个列表作为参数,然后将该函数应用于列表中的每个元素,并返回应用后的新列表。通常用于对列表中的每个元素进行转换或映射操作

    -- 定义一个函数,将列表中的每个元素加倍
    double :: Int -> Int
    double x = x * 2-- 使用 map 将 double 函数应用于列表中的每个元素
    mappedList = map double [1, 2, 3, 4, 5]  -- 结果为 [2, 4, 6, 8, 10]
    
  2. filterfilter 函数接受一个谓词函数(predicate function)和一个列表作为参数,然后返回满足谓词条件的元素组成的新列表。通常用于从列表中筛选出满足特定条件的元素

    -- 定义一个函数,用于判断一个数字是否为偶数
    isEven :: Int -> Bool
    isEven x = x `mod` 2 == 0-- 使用 filter 筛选出列表中的偶数
    filteredList = filter isEven [1, 2, 3, 4, 5]  -- 结果为 [2, 4]

  3. foldrfoldr 函数接受一个二元操作函数、一个初始值和一个列表作为参数,然后将该操作函数应用于列表中的每个元素,从右向左地将列表折叠成单一的值,通常用于对列表中的元素进行聚合操作。

    -- 定义一个二元操作函数,用于计算列表中所有元素的和
    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)要开始扁平化的第一个维度&#xff08;默认值 1&#xff09;end_dim (int)要结束扁平化的最后一个维度&#xff08;默认值 -1&#xff09; 2 举例 input torch.ra…...

一个人应该怎么操作抖音小店呢?店铺操作流程给你讲解清楚!

大家好&#xff0c;我是电商小V 现在入驻抖音小店的有很多新手&#xff0c;新手最关心的就是一个人应该如何操作抖音小店&#xff0c;操作抖音小店需要做好哪几步呢&#xff1f;关于这个问题咱们就来详细的讲解一下&#xff0c; 第一点&#xff1a;开店 开店是做店的第一步&…...

“等保测评与安全运维的协同:保障企业网络安宁

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

python抽取pdf中的参考文献

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

Java进阶学习笔记21——泛型概念、泛型类、泛型接口

泛型&#xff1a; 定义类、接口、方法的时候&#xff0c;同时声明了一个或者多个类型变量&#xff08;如: <E>&#xff09;,称之为泛型类、泛型接口、泛型方法&#xff0c;我们统称之为泛型。 说明这是一个泛型类。 如果不使用泛型&#xff0c;我们可以往ArrayList中传…...

深入理解计算机系统 家庭作业4.55

...

第二天-⑦前后端需要注意的事项

①防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代码】

来源&#xff1a;微信公众号&#xff1a;EW Frontier 本代码主要模拟杂波环境&#xff08;飞机、地杂波、鸟类信号&#xff09;下&#xff0c;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) 的文章&#xff1a;https://source.android.com/docs/core/connect/wifi-softap?hlzh-cn 在 Android 11 的WifiManager类中有一套系统 API 可以控制热点的开和关&#xff0c;代码如下&#xff1a; 开启热点&#xff1a; // SoftApC…...

DI-engine强化学习入门(三)DI-ZOO强化学习环境搭建与示例运行——Atari

Atari是一家知名的电子游戏公司&#xff0c;成立于1972年&#xff0c;是早期电子游戏产业的先驱之一。在强化学习领域&#xff0c;提到Atari通常指的是Atari 2600游戏的一系列环境&#xff0c;这些环境是用于开发和测试强化学习算法的标准平台。 Atari 2600 强化学习环境概述 …...

【一站式学会Kotlin】第十节:kotlin 语言的可控性特点和安全调用操作符

作者介绍: 百度资深Android工程师T6,在百度任职7年半。 目前:成立赵小灰代码工作室,欢迎大家找我交流Android、微信小程序、鸿蒙项目。= 一:通俗易懂的人工智能教程:https://www.captainbed.cn/nefu/ 点一下,打开新世界的大门。 二:【一站式学会Kotlin】免费领取:作者…...

PaddleClas 指定gpu

在使用PaddleClas进行模型训练或预测时&#xff0c;如果您想要指定使用特定的GPU设备&#xff0c;可以通过CUDA_VISIBLE_DEVICES环境变量来设置。 在命令行中设置GPU的方法如下&#xff1a; # 指定第0号GPU export CUDA_VISIBLE_DEVICES0 # 之后运行PaddleClas的命令&#xf…...

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——列表初始化和声明

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、列表初始化1.1 内置类型1.2 结构体或类1.3 容器 二、声明2.1 auto2.2 decltype2.3 nullptr 三、STL的…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...