类型和多态基础.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文档。上传文档
查看更多
类型和多态基础

类型和多态基础 课程内容: 什么是静态类型?它们为什么有⽤? Scala 中的类型 参数化多态性 类型推断 变性 Variance 边界 量化 什么是静态类型?它们为什么有⽤? 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 Milner算法,它最早是实现在 ML 中的。 Scala类型推断系统的实现稍有不同,但本质类似:推断约束,并试图统⼀类型。 例如,在Scala 中你⽆法这样做: scala { x = x } console:7: error: missing parameter type { x = x } ⽽在O aml 中你可以: # fun x - x;; - : a - a = fun 在Scala 中所有类型推断是 局部的 。Scala⼀次分析⼀个表达式。例如: scala def id[T](x : T)

文档评论(0)

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

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

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档