第六篇 高阶函数.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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 ! 你得保证已经弄明⽩了柯⾥函数与不全调⽤的原理,它们很重要 ! 中缀函数也可以不全调⽤,⽤括号把它 ⼀边的参数括在⼀起就⾏了。 这返回

文档评论(0)

0520 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档