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已从‘可选项’升级 阅读详情

相关推荐

YOLO26算法心电图十二导联目标检测+训练好的模型+368张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[导联I(I), 导联II(II), 导联III(III), 胸导联V1(V1), 胸导联V2(V2), 胸导联V3(V3), 胸导联V4(V4), 胸导联V5(V5), 胸导联V6(V6), 加压肢体导联aVF(aVF), 加压肢体导联aVL(aVL), 加压肢体导联aVR(aVR)] · 训练集:313 张 · 验证集:37 张 · 测试集:18 张 · 总计:368 张 该数据集聚焦于临床心电图信号的精准识别与定位,其核心检测目标为标准12导联心电图中的各个独立导联波形区域,涵盖肢体导联(I、II、III)与加压肢体导联(aVR、aVL、aVF),以及胸前导联(V1至V6),适用于心电图自动分析系统中对各导联位置的快速准确标注与分类。数据采集场景真实还原了医院心电图室或急诊监护环境下的标准心电图记录纸,波形清晰、基线稳定,具有高度临床参考价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 57 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9708** mAP50-95 | 0.6344 Precision | 0.8990 Recall | 0.9191 train/box_loss | 1.2231 train/cls_loss | 0.9703 val/box_loss | 1.2779 val/cls_loss | 0.... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

Haskell语言学习笔记(14)Foldable

Foldable

zwvista的专栏 1590

企业级AI助手平台 开箱即用的全栈AI平台,支持多智能体协同、Supervisor模式编排、多种决策模式、RAG技术和流程编排能力 支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化

企业级AI应用开发框架,支持多厂商大模型统一接入与管理,安全可控的企业知识库与高精度检索优化能力,提供可视化流程编排、自主决策智能体与多智能体协同调度,兼容主流 Agent Skill 协议,帮助企业与开发者零门槛快速构建安全、高效、可落地的AI智能体应用与行业解决方案。

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

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

zwvista的专栏 6979

【Unity】Pico VR 开发实战:从环境搭建到交互实现

本文是一份详细的Unity Pico VR开发实战指南,涵盖从环境搭建到核心交互实现的全流程。详细讲解了如何集成Pico Unity Integration SDK与XR Interaction Toolkit,配置开发环境,并重点解析了手柄输入处理、射线交互以及VR UI操作三大核心模块的代码实现与优化技巧,帮助开发者快速上手Pico VR应用开发。

rice5的博客 1173

Python爬虫实战:5分钟搞定大众点评评论数据抓取(附完整代码)

本文详细介绍了使用Python爬虫高效获取大众点评评论数据的5个关键技巧,包括环境配置、智能页面解析、反反爬策略、数据存储与容错设计以及性能优化。通过实战案例和完整代码,帮助开发者快速掌握文本挖掘技术,适用于市场分析和商业决策。

weixin_30660027的博客 290

Haskell 学习记录

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

tangtong 166

深交所 vs 上交所:Level-2实时数据推送规则详解与策略适配指南

本文深度解析沪深Level-2实时数据推送规则的关键差异,包括逐笔成交、逐笔委托和10档行情接口的处理逻辑。针对高频交易策略,详细对比上交所与深交所在数据推送机制、时间戳处理及委托队列解析等方面的差异,并提供具体的策略适配方案和性能优化建议,帮助量化投资者提升跨市场交易稳定性。

weixin_27310417的博客 1164

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

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

weixin_30788619的博客 452

STM32F103VET6实战:用W25Q64外部Flash实现Bootloader+Application双备份(含完整代码解析)

本文详细介绍了基于STM32F103VET6微控制器和W25Q64外部Flash实现Bootloader+Application双备份固件升级的完整方案。通过精心设计的Flash分区策略、可靠的Bootloader程序以及包含双重校验和自动回滚机制的升级流程,有效解决了远程升级过程中断电导致设备变砖的风险,确保了工业嵌入式系统的高可靠性与稳定性。

linux的博客 823

三菱CNC数据采集实战:从SDK安装到C#代码调试全流程(附完整资源包)

本文为C#开发者提供了三菱CNC数据采集的完整实战指南。详细介绍了从获取并安装核心A2协议SDK、配置Visual Studio开发环境,到理解COM接口文档、封装C#通信类,并构建具备多设备连接与定时采集功能的WinForms应用程序的全流程。文章重点分享了网络调试、异常处理及性能优化等关键实战经验,帮助开发者高效打通工业自动化数据采集链路。

oauth7security的博客 707

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

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

gitblog_00159的博客 795

yolov11添加P2小目标检测头与添加P6超大目标检测头

本文介绍了YOLO目标检测模型中上下采样的原理及应用。上采样通过插值算法放大特征图,YOLO通常采用最近邻插值;下采样则通过带步长的卷积缩小特征图提取高层语义特征。文章详细阐述了这两种操作在YOLO中的实现方式、结构特点及对称性问题,指出下采样后会使用C3模块进行特征整合,上采样后通过concat抑制分割感。此外,还分析了不同分辨率特征图适合检测不同尺寸目标的原因,并提出添加4倍小目标检测头的方法,即对上采样后的特征进行concat和C3模块处理。最后给出了YOLOv5原模型结构和添加4倍检测头后的结构对比

m0_64661770的博客 820

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

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

weixin_30632089的博客 131

【ARM CoreLink 系列 4 -- NIC-400 控制器详细介绍】

正常情况下,一个NIC的实现,可以包含一百多个master和几十个slave,每个master和每个slave都会有一些寄存器,这些寄存器可以被 programming,实际实践中就会对 AMIB 或者 ASIB 或者 IB,当它需要具有 programming的时候,给它指定一个node number。为什么指定Node Number呢?首先,从CPU的角度,它需要有一个1M对齐的地址空间,在这1M地址空间上,对每个ASIB或者AMIB这样的接口给它一个node number以后,

CodingCos的博客 5241

嵌入式数字信号处理器(DSP)高频面试题及参考答案

数字信号处理器(DSP)是一种专门设计用于执行数字信号处理任务的微处理器。它具有高度优化的架构,能够高效地执行复杂的数学运算,如快速傅里叶变换(FFT)、卷积、滤波和其他信号处理算法。DSP通常具有高速的中央处理器、专用的硬件乘法器、累加器、硬件循环支持和高速的内存访问能力,以满足实时信号处理的需求。通信:用于调制解调、语音编码、数据压缩、加密和解密。音频处理:如音乐合成、音效增强、语音识别和语音合成。视频和图像处理:包括图像压缩、视频编码、图像增强和模式识别。生物医学工程。

大模型大数据攻城狮的专栏 5267

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

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

weixin_34273046的博客 151

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

gitblog_01144的博客 816

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

龙哥盟 65

haskell的学习步骤和资料

学习步骤 1 函数式编程的思想  http://blog.csdn.net/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.csdn.net/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、付费专栏及课程。

余额充值