3天学习haskell---haskell第二天

Haskell带你玩转函数 函数,再简单不过的概念。不管是什么范式的编程语言,都离不开用函数来表达逻辑。而函数式编程,当然核心就是函数。但函数式编程中的函数与其他语言有什么区别呢?本节都带着大家领略一下Haskell中强大的函数。这也是我们最应该从Haskell中学习,如果你觉得Haskell或其他函数式语言中的其他概念都太复杂太学术,那函数就是你至少应该从中收益的。再回到日常项目的非函数式语言时,学会领悟如何识别概念、分析... 阅读详情

本节最重要的是map和filter。他们的作用等价于list comprehension,如[x*2 | x <- [1,2..10] ]左边是map,右边是filter。

foldl也比较重要,类似reduce函数,规约计算

一  高阶函数

所谓高阶函数,即输入输出均为函数的函数。

1匿名函数(不常用,一般都用有名字的)

语法格式为(\para1..paran->function_body)

例如,连接字符串(\x->x++"world")"hello"

2 map

map可以讲一个函数映射到一个列表上

3filter,foldl,foldr

filter 对于列表中每个元素测试。如filter odd[1,2,3]

fold 一个fold取一个二元函数,一个初始值(我喜欢管它叫累加值)和一个需要fold(折叠)的list。这个二元函数有两个参数,即累加值和list的首项(或尾项),返回值是新的累加值。然后,以新的累加值和新的list首项调用该函数,如是继续。到list遍历完毕时,只剩下一个累加值,也就是最终的结果

foldl 左折叠函数 参考自 http://www.yeeyan.org/articles/view/ssword/50295

首先看下foldl函数,也叫做左折叠。它从list的左端开始折叠,用初始值和list的头部调用这二元函数,得一新的累加值,并用新的累加值与list的下一个元素调用二元函数。如是继续。

 我们再实现下sum,这次用fold替代那复杂的递归:

 sum' :: (Num a) => [a] -> a  

sum' xs = foldl (acc x -> acc + x) 0 xs  

ghci> sum' [3,5,2,1]   

11  

 我们深入看下fold的执行过程:acc x-> acc + x 是个二元函数,0是初始值,xs是待折叠的list。一开始,累加值为0,当前项为3,调用二元函数0+3得3,作新的累加值。接着来,累加值为3,当前项为5,得新累加值8。再往后,累加值为8,当前项为2,得新累加值10。最后累加值为10,当前项为1,得11。恭喜,你完成了一次折叠(fold)!

foldr右折叠函数 (从右边开始)

二 偏应用函数和柯里化

一言以蔽之:每个haskell函数只有一个参数。代码中的多参数函数实际上使用柯里化机制自动变成单参数函数。(programmer dont care)

三 惰性求值

惰性求值是为了构建无穷列表。使用head(得到第一个),drop(去掉前几项),take(得到前几项)

例如 myrange start step=start:(myrange start+step step)

take 10 (myrange 10 1)

 

四  附:列表和元组的操作函数

参考自:http://wizardmin.com/2011/05/haskell_basic_1/

 (0) map,filter,flodr,foldl参考上边

(1)连接 ++ :

++

ghci> [1,2,3] ++ [6,7,8]   

[1,2,3,6,7,8]

: 

5:[1,2,3,4]
[5,1,2,3,4]

(2)!! 访问列表元素
ghci> [1,2,3,4,5,6,7] !! 1
2

(3)多维
ghci> let b = [[1,2,3,4],[5,3,3,3],[1,2,3]]
ghci> [6,6,6] : b
[[6,6,6],[1,2,3,4],[5,3,3,3],[1,2,3]]
但不能这样定义:b =[1,2,[3,4]],类型不一样

(4)列表对比关系
采用<, >,==等根据字典序进行比较
ghci > [3,2,1] > [2,1,0]
True

(5)其他操作
head 获取列表第一个元素
ghci> head [[1,2,3],[4,5,5],[2,3,5]]
[1,2,3]

tail 取列表中除了第一个元素的其他元素
ghci> tail [1,2,3,4,5]
[2,3,4,5]

last 取列表最后一个元素(与head对应)
init 取列表中除了最后一个元素的其他元素(与tail对应)

length 列表长度(不递归计算)

    ghci> length [[1,2,3], [2,1,3], [1,3,5]]   3

null 检测列表是否为空
reverse 反转列表

take 从列表头开始取指定个数的元素

ghci> take 3 [5,4,3,2,1]
[5,4,3]
ghci> take 8 [5,4,3,2,1]
[5,4,3,2,1]
ghci> take 0 [5,4,3,2,1]
[]

drop 跳过列表头指定个数的元素的列表
ghci> drop 3 [5,4,3,2,1]
[2,1]

maximum 取列表最大的元素
minimum 娶列表最小的元素
sum 列表总和
product 列表乘积
elem 判断元素是否属于列表(一般当作中缀型使用)
ghci> 3 `elem` [3,4,5,6]
True

zipwtith 对两个列表的对应位置元素进行操作

例如  zipWith (+) [1,2,3] [1,2,3]
[2,4,6]

(6)枚举
在Haskell,由1到10的数字组合的列表不需列出所有数字
ghci> [1..10]
[1,2,3,4,5,6,7,8,9,10]

(7)集合
类似高等数据的集合
例如:数学定义{2 · x| x ∈ N, x ≤ 10}
ghci> [x * 2 | x <- [1..10]]
[2,4,6,8,10,12,14,16,18,20]

竖线(|)前是集合输出,竖线后是元素的定义
ghci> [x | x <- [50..100], x `mod` 7 == 0]
[56,63,70,77,84,91,98]

 


元组
元组是把不同类型的元素存储到一个值的方式,不同长度(元素个数不一样)的元组是定义为不同类型的,相同长度但对应的元素类型不一样的元素也是定义为
不同类型。例如:[(1,2),(8,11,5)]或[(1,2),(1,'a')]是错误的。

对(长度为2的元组)
长度为2的元组比较常用,可以由fst和snd函数操作(不能操作长度不为2的元组)
ghci> fst (8, 11)
8
ghci> snd (8, 11)
11
zip函数将两个列表组合成对,变成元组的列表
ghci> zip [1,2,3,4] [5,5,5]
[(1,5),(2,5),(3,5)](多余的元素会被删掉)


本文参考自 《七周七语言》。


课后题答案:

--8.3.6
qsort []=[]
qsort (h:t)=(qsort(filter (<h) t) )++(num (h:t)) ++(qsort(filter (>h) t))
num (h:t)=filter (==h) (h:t)


qsort2 compare1 []=[]
qsort2 compare1 (h:t)=(qsort2 compare1 (filter (compare1 h) t))++(num (h:t))++(qsort2  compare1 (filter (\x->(x/=h)&&(not(compare1 h x))) t ))


compare1 a b=a<b


--4
--belazy1 x=[x]++(belazy1 x+2)
belazy1 x=x:(belazy1 (x+2))
belazy2 y=y:(belazy2 (y+4))


belazy x y=(zipWith (+) (belazy1 x) (belazy2 y))
--5
cfun x=x/2


--6
func6 0 y=y
func6 x 0=x
func6 x y=if (x>y) then (func6 y (mod x y)) else  (func6 x (mod y x)) 


--7sushu
func7 =[x|x<-[1..],func77 x]
func77 x=func777 x (x-1)
func777 1 0=False
func777 1 1=False 
func777 x 1=True
func777 x y=if( (mod x y) ==0 )then False else (func777 x (y-1))

 



 

 

 


miniforge vs Anaconda:为什么现代Python环境该选极简conda发行版 Python环境管理本质是依赖解析与包分发的工程问题。传统Anaconda采用回溯搜索求解器,多channel混源导致冲突频发、安装缓慢;而miniforge以libmamba SAT求解器重构核心,实现毫秒级依赖解析,并强制统一基于conda-forge生态,保障ABI兼容性与更新时效性。其零预装设计显著降低体积与启动延迟,特别适合CI/CD、JupyterHub、M1/M2芯片及容器化部署等对启动速度、确定性和资源敏感的场景。对于90%的数据科学与机器学习开发者而言,miniforge已从‘可选项’升级 阅读详情

相关推荐

政府科技管理者如何提升科技成果评估的准确性与透明度?.docx

政府科技管理者如何提升科技成果评估的准确性与透明度?

Haskell语言学习笔记(14)Foldable

Foldable

zwvista的专栏 1590

双闭环PWM整流器VOC控制 +SVPWM调制仿真(Simulink仿真实现)

内容概要:本文详细介绍了基于Simulink平台构建的双闭环PWM整流器VOC(虚拟磁链定向控制)与SVPWM(空间矢量脉宽调制)相结合的仿真模型,系统阐述了三相电压型PWM整流器在电压定向控制策略下的建模方法与控制实现。通过设计外环直流电压控制与内环电流控制的双闭环结构,实现了对整流器的高功率因数运行、能量双向流动及动态性能优化的精确调控。结合SVPWM调制技术,有效提升了直流侧电压利用率并显著降低输出电流谐波含量,增强了系统的整体效率与稳定性。该仿真模型适用于新能源发电、电动汽车充电系统、微电网等高性能电能变换应用场景,文档还配套提供了丰富的学习资源与技术支持渠道,便于深入研究与工程实践。; 适合人群:面向电气工程、自动化、电力电子及相关专业的高校学生、科研人员以及从事新能源、智能电网、电力传动等领域研发工作的工程师;尤其适合已具备自动控制理论、电力电子变换技术和MATLAB/Simulink仿真基础的专业人士进一步深化学习与应用。; 使用场景及目标:①深入理解PWM整流器的工作机理及其双闭环控制系统的架构设计;②掌握VOC控制与SVPWM调制的协同工作机制,提升系统动静态响应性能;③支撑科研课题、课程设计、毕业设计或实际工程项目中的整流器控制系统开发与验证;④作为高级电能变换技术的学习范例,促进对现代电力电子系统控制策略的综合理解与创新能力培养。; 阅读建议:建议结合文中提供的百度网盘链接与公众号资源,下载完整的Simulink仿真模型进行实操演练,在MATLAB环境中调整控制器参数并观察仿真结果,深入剖析控制逻辑与系统响应特性;同时可参考同系列资源如PI双闭环控制、电网不平衡工况下的控制策略等案例,开展对比分析与拓展研究,全面提升系统建模与控制设计的综合能力。

Haskell语言学习笔记(3)map, filter, fold

map filter foldl foldr的递归实现 以及用foldr实现map filter foldl

zwvista的专栏 6979

别再硬啃C代码了!用Simulink的Matlab Function模块手把手教你搭建CRC8校验模型(附完整M脚本)

本文详细介绍了如何利用Simulink的Matlab Function模块轻松实现CRC8校验模型,替代传统的C代码编写。通过可视化建模和即时验证,开发者可以高效完成算法设计,并自动生成嵌入式代码。文章包含完整的M脚本示例和工程实践技巧,特别适合嵌入式系统开发人员提升工作效率。

weixin_42520661的博客 183

别再踩坑了!QT5.15.2配置Android开发环境保姆级避坑指南(含Java8、SDK Tools版本选择)

本文提供QT5.15.2配置Android开发环境的详细避坑指南,重点解决版本锁定、SDK工具选择和QtCreator配置等常见问题。通过实测推荐的Java8、Android SDK Tools版本及NDK配置,帮助开发者高效完成环境搭建,避免隐性冲突和配置失败。

weixin_42537919的博客 237

Haskell 学习记录

大概去年的这个时候,我听说了函数式编程这个词儿,一头雾水。大概半年前,想学Lisp,看到一大堆括号,木然了。半个月前的某个时候,我喜欢上了Haskell。第一天不知所云,第二天略有所知,第三天突然豁然开朗。Haskell大概就是我找寻多年的武器。强类型,避免了一些“指误”,惰性求值和高阶运算给了极大的抽象能力。但是猛然发现,几天后,自己竟然没有多少提高,于是决定回顾一下原来收集的那些经典书籍,希望...

tangtong 166

RAG开源框架深度评测:从RAGFlow到Dify的实战选型指南

本文深度评测了主流RAG开源框架(RAGFlow、Dify、WeKnora)的核心能力与实战表现,提供企业级选型指南。重点对比了文档解析、检索性能和生产部署等关键指标,揭示RAGFlow在复杂文档处理、Dify在低代码开发、WeKnora在腾讯生态集成的差异化优势,并给出技术选型决策树与成本优化方案。

weixin_29294597的博客 825

七周七语言:理解多种编程范型pdf

下载地址:网盘下载作者简介······作者简介:Bruce A. Tate RapidRed公司总裁,该公司主要为Ruby轻量级开发提供咨询。他曾任职于IBM公司,并担任过多家公司的客户解决方案总监和CTO。著作有十余本,包括荣获Jolt大奖的Better, Faster, Lighter Java。译者简介:戴玮 80后宅男,中科院自动化所在读...

weixin_30788619的博客 452

深入LSM6DSL的FIFO连续模式:基于STM32和MEMS库的数据流高效处理指南

本文深入探讨了LSM6DSL的FIFO连续模式,结合STM32硬件平台和ST官方MEMS库,提供了高效的数据流处理方案。通过优化I2C通信时序、中断驱动设计以及动态ODR调整,实现低功耗数据采集与处理,显著提升嵌入式传感器应用的性能和续航能力。

weixin_30387799的博客 348

AUTOSAR从入门到精通-中间件通信DDS(一)

汽车开放系统架构(automotive open system architecture,autosar)是由全球各大汽车oem、零部件供应商、汽车电子软件公司联合建立的一套标准协议。该协议规范了一个符合汽车电子软件开发的、开放的以及标准化的软件架构。最初的autosar规范的制定只考虑传统汽车电子电器架构,基于硬件算力有限场景,提供确定的功能。

getusushu的博客 1869

3 分钟上手 Pandoc:一份绕开文档格式泥潭的转换实战地图

周五晚上九点,陈默把改了三轮的论文手稿发给导师,三分钟后收到回复:"期刊要求 docx,你发的是 Markdown,转一下吧。"他打开 Word 手动排版到凌晨。第二天,同事丢来一份 LaTeX 源码要合并意见,客户又点名要 HTML 版本——同一个内容,三种格式,三次折腾。 直到他遇到 **Pandoc**,这个自称 *universal markup converter*(通用标记转换器)的

gitblog_00159的博客 795

【音视频基础】一篇搞懂视频的各种封装格式

在现代多媒体处理中,视频封装格式扮演着至关重要的角色。不同的封装格式决定了视频文件的存储方式、兼容性以及功能特性。无论是观看高清视频、编辑电影剪辑,还是在互联网上流式传输内容,理解各种视频封装格式的基础知识都是必不可少的。在这篇文章中,我们将详细介绍常见的视频封装格式,探讨为什么需要这些格式,以及它们各自的功能和区别,帮助你在选择和使用视频格式时做出更明智的决定。WEBM理解各种视频封装格式的功能和区别对于选择合适的格式至关重要。

m0_62599305的博客 2477

[转]我是如何设计并实现一门程序设计语言——一门函数式编程语言Lucida的诞生...

原文地址:http://www.cnblogs.com/figure9/archive/2011/07/10/2102613.html Lucida——一门函数式程序设计语言的诞生 起因 自己从本科那会就开始想写一个编程语言,不过 那会缺乏编译的功底。自从阅读了DSL和Language Implementation Patterns,并写了一个一定规模的Parser之后,对编...

weixin_30632089的博客 131

BF8815A

了解ADBMS1818芯片的人会发现,这款BF8815B和1818有着很多相似的东西,当你了解其中一款AFE之后,另一款你的上手也会特别快,下面文章是我针对1818梳理的一些重要知识点,此篇文章主要讲解BF8815B的一些差异点。

m0_61973119的博客 561

学Simulink——基于电能质量治理的场景实例:静止无功发生器(SVG)与并网逆变器的结合

本文详细介绍了基于Simulink的SVG与光伏并网逆变器联合仿真建模方法。系统包含光伏单元、SVG主电路、控制策略(无功检测+双闭环控制)等模块,通过ip-iq法实现动态无功补偿。仿真结果表明,SVG能快速响应负载变化,将功率因数提升至0.98以上,有效稳定母线电压。该方案为新能源并网系统提供了有功/无功协同控制解决方案,具有10ms级响应速度和±5kvar补偿能力。文章提供了完整的建模流程、控制算法实现和结果分析,可作为电力电子与电能质量治理领域的实践指导。

amy_mhd的博客 167

我是如何设计并实现一门程序设计语言——一门函数式编程语言Lucida的诞生

Lucida——一门函数式程序设计语言的诞生起因自己从本科那会就开始想写一个编程语言,不过那会缺乏编译的功底。自从阅读了DSL和Language Implementation Patterns,并写了一个一定规模的Parser之后,对编译有了一个比较全的认识,大概也能想清一个语言的运行机理和实现过程。而且到现在自己用过的语言也不少了,过程的有C,OO的有C++、C#、Java,脚本的有Javasc...

weixin_34273046的博客 151

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

5 分钟上手 notepad-- 代码折叠:从深夜改 bug 到团队评审的效率密码

> 相关源码:编辑核心 [src/scintillaeditview.cpp](https://link.gitcode.com/i/a543247530286ecec88b475a4210b2d7)、快捷键注册 [src/shortcutkeymgr.cpp](https://link.gitcode.com/i/8b838acc269211cb4d3ba38dfd97ab7a)、界面模块 [s

gitblog_00683的博客 728

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Stagehand 自然语言浏览器自动化:零基础 10 分钟跑通取数与点击操作

为一个抓取脚本维护几十行选择器,站点一改版,脚本当场报废。Stagehand 是一个开源浏览器自动化 SDK:用自然语言描述意图,由模型自己找元素、点按钮、把页面数据按你定义的结构取回,给需要操作网页又不想再维护选择器的开发者。 ## 🧭 传统做法:人肉维护选择器,这里是让模型看页面 传统流程是三步:写 CSS 或 XPath 选择器定位节点、解析出文本、再手工清洗成字段。页面换个类名或加个

gitblog_01144的博客 816

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

哈佛 CS2881r 人工智能安全笔记(一)

本节课中我们一起学习了现代大语言模型从预训练到安全训练的完整流程。我们了解了下一个词预测作为训练目标的原因,Transformer架构如何为高效计算而设计,以及监督微调、强化学习(特别是基于奖励模型的RLHF)各自的作用和挑战。我们还探讨了针对推理过程的强化学习其意义和安全考量,并介绍了通过“深思熟虑的对齐”进行更高级安全训练的方法。理解这些基础流程,是我们后续深入探讨对齐问题与安全挑战的基石。在本节课中,我们一起学习了人工智能安全中的鲁棒性问题。

龙哥盟 65

haskell的学习步骤和资料

学习步骤 1 函数式编程的思想  http://blog.youkuaiyun.com/crazyhacking/article/category/1280842 2 haskell初步 参考自己的学习笔记 3haskell进阶 学习资料 使用书本:《七周七语言》 英文书本: http://learnyouahaskell.com/chapters 查找函数hoogle :h

crazyhacking的专栏 1154

3天学习haskell---haskell第三天

一类 1 自定义类型 data关键字用来定义自己的数据类型 (类型必须大写) data Rank=Ten | jack |queen |king |ace 2 多态 (1)backwards::[a]->[a] backwards []=[] backwards (h:t)=backwards t ++ [h] [a]的类型是一个元素为任意类型的列表。 (2)data Tripl

crazyhacking的专栏 982

Monad-进阶理解

一 一个例子(按此贴的理解:http://blog.youkuaiyun.com/crazyhacking/article/details/8270930) 定义: data Position t=Position t deriving (Show) stagger (Position d)=Position (d+2) crawl (Position d)=Position (d+1) r

crazyhacking的专栏 935

3天学习haskell---haskell第一天

一 表达式和基本类型 这个类似于命令式语言 二函数 函数是函数式编程的一等公民。 这部分最重要的是递归函数。 1基本递归 例如,求阶乘 代码:fact x=if x==0 then 1 else fact(x-1)*x 2 模式匹配(实现递归) fact 0=1 fact x=x*fact(x-1) 3 哨兵表达式(为了改变模式匹配的顺序) fact x   |x>1 =

crazyhacking的专栏 875
上一篇: 3天学习haskell---haskell第一天
下一篇: haskell Standard list functions(列表的标准库函数)
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值