第三章 类型和类型类.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文档。上传文档
查看更多
第三章 类型和类型类

第三章 类型和类型类 相信类型 在前⾯我们谈到Haskell是静态类型的,在编译时每个表达式的类型都已明确,这就提 ⾼了 码的安全性。若 码中让布尔值与数字相除,就不会通过编译。这样的好处就 是与其让程序在运⾏时崩溃,不如在编译时捕获可能的错误。Haskell 中万物皆有类 型,因此在执⾏编译之时编译器可以⼤有所为。 与j ava和pascal不同,haskell⽀持类型推导。写下⼀个数字,你就没必要另告诉haskell 说“它是个数字” ,它⾃⼰能推导出来。这样我们就不必在每个函数或表达式上都标明 其类型了。在前⾯我们只简单涉及⼀下haskell的类型⽅⾯的知识,但是理解这⼀类型 系统对于haskell 的学习是⾄关重要的。 类型是每个表达式都有的某种标签,它标明了这⼀表达式所属的范畴。例如,表达式 True是boolean型,hello是个字符串,等等。 可以使⽤ghci来检测表达式的类型。使⽤:t命令后跟任何可⽤的表达式,即可得到该表 达式的类型,先试⼀下: ghci :t a a :: Char ghci :t True True :: Bool ghci :t HELLO ! HELLO ! :: [Char] ghci :t (True, a) (True, a) :: (Bool, Char) ghci :t 4 == 4 == :: Bool 可以看出,:t命令处理⼀个表达式的输出结果为表达式后跟::及其类型,::读作“它 的类型为” 。凡是明确的类型,其⾸字母必为⼤写。a,如它的样⼦,是Char类型, 易知是个字符 (character )。True是Bool类型,也靠谱。不过这又是啥,检 测hello得⼀个[Char]?这⽅括号表⽰⼀个List ,所以我们可以将其读作“⼀组字 符的List” 。⽽与List不同,每个Tuple都是独⽴的类型,于是(True,a)的类型 是(Bool,Char),⽽(a,b,c)的类型为(Char,Char,Char)。4== ⼀定 返回 False ,所以它的类型为Bool 。 同样,函数也有类型。编写函数时,给它⼀个明确的类型声明是个好习惯,⽐较短的 函数就不⽤多此⼀举了。还记得前⾯那个过滤⼤写字母的List Comprehension吗?给它 加上类型声明便是这个样⼦: removeNonUppercase :: [Char] - [Char] removeNonUppercase st = [ c | c st, c `elem` [A ..Z]] removeNonUppercase的类型为[Char]-[Char],从它的参数和返回值的类型上 可以看出,它将⼀个字符串映射为另⼀个字符串。[Char]与String是等价的,但使 ⽤ tring会更清晰:removeNonUppercase :: String - String。编译器会⾃ 动检测出它的类型,我们还是标明了它的类型声明。要是多个参数的函数该怎样?如 下便是⼀个将三个整数相加的简单函数。 addThree :: Int - Int - Int - Int addThree x y z = x + y + z 参数之间由-分隔,⽽与返回值之间并⽆特殊差异。返回值是最后⼀项,参数就是前 三项。稍后,我们将讲解为何只⽤-⽽不是Int,Int,Int-Int之类“更好看”的⽅ 式来分隔参数。 如果你打算给你编写的函数加上个类型声明却拿不准它的类型是啥,只要先不写类型 声明,把函数体写出来,再使⽤:t命令测⼀下即可。函数也是表达式,所以:t对函数也 是同样可⽤的。 如下是⼏个常见的类型: Int表⽰整数。7可以是Int ,但7 .2不可以。Int是有界的,也就是说它由上限和下限。对 32位的机器⽽⾔,上限⼀般是2,下限是-2。 Integer表⽰...厄...也是整数,但它是⽆界的。这就意味着可以⽤它存放⾮常⾮常⼤的 数,我是说⾮常⼤。它的效率不如Int⾼。 factorial :: Integer - Integer factorial n = product [1..n] ghci factorial 0 30414093201713378043612608166064768844377641 68960 12000000000000 Float表⽰单精度的浮点数。 cir

文档评论(0)

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

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

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档