网站大量收购独家精品文档,联系QQ:2885784924

第二章:类型与函数.pdf

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第⼆章:类型和函数 第⼆章:类型和函数 类型是⼲什么⽤的? Haskell 中的每个函数和表达式都带有各⾃的类型,通常称⼀个表达式拥有类型 T , 或者说这个表达式的类型为 T 。举个例 ,布尔值 True 的类型为 Bool ,⽽字符串 foo 的类型为 String 。⼀个值的类型标识了它和该类型的其他值所共有的⼀簇属性 (property ),⽐如我们可以对数字进⾏相加,对列表进⾏拼接,诸如此类。 在对 Haskell 的类型系统进⾏更深⼊的探讨之前,不妨先来了解下,我们为什么要关 ⼼类型 —— 也即是,它们是⼲什么⽤的? 在计算机的最底层,处理的都是没有任何附加结构的字节 (byte )。⽽类型系统在这 个基础上提供了抽象:它为那些单纯的字节加上了意义,使得我们可以说“这些字节 是⽂本” ,“那些字节是机票预约数据” ,等等。 通常情况下,类型系统还会在标识类型的基础上更进⼀步:它会阻⽌我们混合使⽤不 同的类型,避免程序错误。⽐如说,类型系统通常不会允许将⼀个酒店预约数据当作 汽车租凭数据来使⽤。 引⼊抽象的使得我们可以忽略底层细节。举个例 ,如果程序中的某个值是⼀个字符 串,那么我不必考虑这个字符串在内部是如何实现的,只要像操作其他字符串⼀样, 操作这个字符串就可以了。 类型系统的⼀个有趣的地⽅是,不同的类型系统的表现并不完全相同。实际上,不同 类型系统有时候处理的还是不同种类的问题。 除此之外,⼀门语⾔的类型系统,还会深切地影响这门语⾔的使⽤者思考和编写程序 的⽅式。⽽ Haskell 的类型系统则允许程序员以⾮常抽象的层次思考,并写出简洁、 ⾼效、健壮的代码。 Haskell 的类型系统 Haskell 中的类型有三个有趣的⽅⾯:⾸先,它们是强 (strong )类型的;其次,它们 是静态 (static )的;第三,它们可以通过⾃动推导 (automatically inferred )得出。 后⾯的三个⼩节会分别讨论这三个⽅⾯,介绍它们的长处和短处,并列举 Haskell 类 型系统的概念和其他语⾔⾥相关构思之间的相似性。 强类型 Haskell 的强类型系统会拒绝执⾏任何⽆意义的表达式,保证程序不会因为这些表达式 ⽽引起错误:⽐如将整数当作函数来使⽤,或者将⼀个字符串传给⼀个只接受整数参 数的函数,等等。 遵守类型规则的表达式被称为是“类型正确的” (well typed ),⽽不遵守类型规则、会 引起类型错误的表达式被称为是“类型不正确的” (ill typed )。 Haskell 强类型系统的另⼀个作⽤是,它不会⾃动地将值从⼀个类型转换到另⼀个类型 (转换有时又称为强制或变换)。举个例 ,如果将⼀个整数值作为参数传给了⼀个 接受浮点数的函数,C 编译器会⾃动且静默 (silently )地将参数从整数类型转换为浮 点类型,⽽ Haskell 编译器则会引发⼀个编译错误。 要在 Haskell 中进⾏类型转换,必须显式地使⽤类型转换函数。 有些时候,强类型会让某种类型代码的编写变得困难。⽐如说,⼀种编写底层 C 代码 的典型⽅式就是将⼀系列字节数组当作复杂的数据结构来操作。这种做法的效率⾮常 ⾼,因为它避免了对字节的复制操作。因为 Haskell 不允许这种形式的转换,所以要 获得同等结构形式的数据,可能需要进⾏⼀些复制操作,这可能会对性能造成细微影 响。 强类型的最⼤好处是可以让 bug 在代码实际运⾏之前浮现出来。⽐如说,在强类型的 语⾔中,“不⼩⼼将整数当成了字符串来使⽤”这样的情况不可能出现。 [注意:这⾥说的“bug”指的是类型错误,和我们常说的、通常意义上的 bug 有⼀些区 别。 静态类型 静态类型系统指的是,编译器可以在编译期 (⽽不是执⾏期)知道每个值和表达式的 类型。Haskell 编译器或解释器会察觉出类型不正确的表达式,并拒绝这些表达式的执 ⾏: Prelude True False interactive:2:9: Couldnt match expected type Bool with actual type [Char] In the second argument of (), namely False In the expression: True False In an equation for it: it = True False

您可能关注的文档

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档