- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第六章 ⾼阶函数
柯⾥函数
是时候了,来点⾼阶函数 !
map 与 filter
lambda
折叠纸鹤
有$的函数调⽤
函数组合
haskell 中的函数可以作为参数 返回值传来传去,这样的函数就被称作⾼阶函数。⾼
阶函数可不只是某简单特性⽽已,它贯穿于haskell的⽅⽅⾯⾯。要拒绝循环与状态的
改变⽽通过定义问题是什么来解决问题,⾼阶函数必不可少。它们是编码的得⼒⼯
具。
柯⾥函数
本质上,haskell的所有函数都只有⼀个参数,那么我们先前编那么多含有多个参数的
函数又是怎么回事? 呵,⼩伎俩! 所有多个参数的函数都是柯⾥函数。 什么意思呢? 取
⼀个例⼦最好理解,就拿我们的好朋友max函数说事吧。它看起来像是取两个参数,
返回较⼤的那个数。 实际上,执⾏max 4 5时,它会⾸先返回⼀个取⼀个参数的函
数,其返回值不是4就是该参数,取决于谁⼤。 然后,以5为参数调⽤它,并取得最终
结果。 这听着挺绕⼜的,不过这⼀概念⼗分的酷! 如下的两个调⽤是等价的:
ghci max 4 5
5
ghci (max 4) 5
5
把空格放到两个东西之间,称作函数调⽤。它有点像个运算符,并拥有最⾼的优先
级。 看看max函数的类型:max :: (Ord a) = a - a - a。 也可以写作:max
:: (Ord a) = a - (a - a)。 可以读作max取⼀个参数a ,并返回⼀个函数
(就是那个-) ,这个函数取⼀个a类型的参数,返回⼀个a 。 这便是为何只⽤箭头来分
隔参数 返回值类型。
这样的好处又是如何? 简⾔之,我们若以不全的参数来调⽤某函数,就可以得到⼀个
不全调⽤的函数。 如果你⾼兴,构造新函数就可以如此便捷,将其传给另⼀个函数也
是同样⽅便。
看下这个函数,简单⾄极:
multThree :: (Num a) = a - a - a - a
multThree x y z = x * y * z
我们若执⾏mulThree 3 5 9或((mulThree 3) 5) 9,它背后是如何运作呢?
⾸先,按照空格分隔,把3交给mulThree。 这返回⼀个返回函数的函数。 然后把5
交给它,返回⼀个取⼀个参数并使之乘以15的函数。 最后把9交给这⼀函数,返回
135。 想想,这个函数的类型也可以写作multThree :: (Num a) = a - (a
- (a - a)),-前⾯的东西就是函数取的参数,后⾯的东西就是其返回值。 所
以说,我们的函数取⼀个a,并返回⼀个类型为(Num a) = a - (a - a)的函
数,类似,这⼀函数返回⼀个取⼀个a,返回⼀个类型为(Num a) = a - a的函
数。 ⽽最后的这个函数就只取⼀个a并返回⼀个a,如下:
ghci let multT oWithNine = multThree 9
ghci multT oWithNine 2 3
54
ghci let multWithEighteen = multT oWithNine 2
ghci multWithEighteen 10
180
前⾯提到,以不全的参数调⽤函数可以⽅便地创造新的函数。例如,搞个取⼀数与
100 ⽐较⼤⼩的函数该如何? ⼤可这样:
compareWithHundred :: (Num a,Ord a) = a - Ordering
compareWithHundred x = compare 100 x
⽤99调⽤它,就可以得到⼀个GT。 简单。 注意下在等号两边都有x 。 想想compare
100会返回什么?⼀个取⼀数与100 ⽐较的函数。 Wow ,这不正是我们想要的? 这样
重写:
compareWithHundred :: (Num a,Ord a) = a - Ordering
compareWithHundred = compare 100
类型声明依然相同,因为compare 100返回函数。 ompare的类型为(Ord a) =
a - (a - Ordering),⽤100调⽤它后返回的函数类型为(Num a,Ord a)
= a - Ordering,同时由于100还是Num类型类的实例,所以还得另留⼀个类约
束。
Yo ! 你得保证已经弄明⽩了柯⾥函数与不全调⽤的原理,它们很重要 !
中缀函数也可以不全调⽤,⽤括号把它 ⼀边的参数括在⼀起就⾏了。 这返回
您可能关注的文档
最近下载
- 1.1 细胞 ( 教案) 六年级上册科学青岛版.docx VIP
- 护理病人签署知情同意规范.pptx VIP
- 2025年福建省中考英语真题试卷完全解读.docx VIP
- 联想笔记本电脑环境标志产品认证证书2022年版.docx VIP
- 标准化变电站建设实施规范(二次设备名称及标识).pdf VIP
- Unit1 Happy Holiday Section A(1a-1d)课件人教版英语八年级上册.pptx VIP
- 监理工作报告制度.doc VIP
- 2020新上外版高中英语选择性必修一Unit1 Reading A Learning is Everywhere 课件.pptx VIP
- 部编高教版2023·职业模块 中职语文 语文职业模块 1.1《七律二首·送瘟神》课件.pptx VIP
- 0-3岁婴幼儿行为观察与分析第四章 0~3岁婴幼儿动作发展观察.pptx VIP
文档评论(0)