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