类型与多态基础.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文档。上传文档
查看更多
类型和多态基础 类型和多态基础 什么是静态类型? 按 Pierce 的话讲:“类型系统是⼀个语法⽅法,它们根据程序计算的值的种类对程序 短语进⾏分类, 过分类结果错误⾏为进⾏⾃动检查。” 类型允许你表⽰函数的定义域和值域。例如,从数学⾓度看这个定义: f: R - N 它告诉我们函数“f”是从实数集到⾃然数集的映射。 抽象地说,这就是具体类型的准确定义。类型系统给我们提供了⼀些更强⼤的⽅式来 表达这些集合。 鉴于这些注释,编译器可以静态地 (在编译时)验证程序是合理的。也就是说,如果 值 (在运⾏时)不符合程序规定的约束,编译将失败。 ⼀般说来,类型检查只能保证不合理的程序不能编译 过。它不能保证每⼀个合理的 程序都可以编译 过。 随着类型系统表达能⼒的提⾼,我们可以⽣产更可靠的代码,因为它能够在我们运⾏ 程序之前验证程序的不变性 (当然是发现类型本⾝的模型 bug !)。学术界⼀直很努 ⼒地提⾼类型系统的表现⼒,包括值依赖 (value-dependent )类型 ! 需要注意的是,所有的类型信息会在编译时被删去,因为它已不再需要。这就是所谓 的擦除。 Scala 中的类型 Scala 强⼤的类型系统拥有⾮常丰富的表现⼒。其主要特性有: 参数化多态性 粗略地说,就是泛型编程 (局部)类型推断 粗略地说,就是为什么你不需要这样写代码 val i: Int = 12: Int 存在量化 粗略地说,为⼀些没有名称的类型进⾏定义 视窗 我们将下周学习这些;粗略地说,就是将⼀种类型的值“强制转换”为另⼀ 种类型 参数化多态性 多态性是在不影响静态类型丰富性的前提下,⽤来 (给不同类型的值)编写 ⽤代码 的。 例如,如果没有参数化多态性,⼀个 ⽤的列表数据结构总是看起来像这样 (事实 上,它看起来很像使⽤泛型前的Java ): scala 2 :: 1 :: bar :: foo :: Nil res5: List[Any] = List(2 1 bar foo) 现在我们⽆法恢复其中成员的任何类型信息。 scala res5.head res6: Any = 2 所以我们的应⽤程序将会退化为⼀系列类型转换 (“asInstanceOf[]” ),并且会缺乏类 型安全的保障 (因为这些都是动态的)。 多态性是 过指定 类型变量 实现的。 scala def drop1[A](l: List[A]) = l.tail drop1: [A](l: List[A])List[A] scala drop1(List(1 2 3)) res1: List[Int] = List(2 3) Scala 有秩 1 多态性 粗略地说,这意味着在 Scala 中,有⼀些你想表达的类型概念“过于泛化” 以⾄于编译 器⽆法理解。假设你有⼀个函数 def toList[A](a: A) = List(a) 你希望继续泛型地使⽤它: def foo[A B](f: A = List[A] b: B) = f(b) 这段代码不能编译,因为所有的类型变量只有在调⽤上下⽂中才被固定。即使你“钉 住” 了类型 B : def foo[A](f: A = List[A] i: Int) = f(i) …你也会得到⼀个类型不匹配的错误。 类型推断 静态类型的⼀个传统反对意见是,它有⼤量的语法开销。Scala 过 类型推断 来缓解 这个问题。 在函数式编程语⾔中,类型推断的经典⽅法是 Hindley ilner 算法,它最早是实现在 L 中的。 Scala 类型推断系统的实现稍有不同,但本质类似:推断约束,并试图统⼀类型。 例如,在 Scala 中你⽆法这样做: scala { x = x } console:7: error: missing parameter type { x = x } ⽽在 OCaml 中你可以: # fun x - x;; - : a - a = fun 在 Scala 中所有类型推断是 局部的 。Scala ⼀次分析⼀个表达式。例如: scala def id[T](x : T) = x id: [T](x : T)T scala val x = id(322) x : In

文档评论(0)

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

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

1亿VIP精品文档

相关文档