- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)
您可能关注的文档
最近下载
- 黑龙江农业工程职业学院单招数学模拟试题(附答案).docx VIP
- 2025读书心得:屏幕时代如何重塑孩子的自控力.docx VIP
- 中国艰难梭菌感染诊断、治疗与预防指南(2024)详细解读PPT课件.pptx VIP
- 第14课《我们都是中国人》第2课时 这是我国的标志 教案设计 2025道德与法治二年级上册.docx
- 湘少版四年级上册、下册的英语单词默写表.pdf VIP
- GBT 危险货物运输应急救援指南 第1部分:一般指南.pdf VIP
- 煤炭掺配合同范本.docx VIP
- 汽车整体认识(汽车发展史)-精.ppt VIP
- 生产安全事故现场处置方案.docx VIP
- 小学数学二年级下册应用题练习.docx VIP
文档评论(0)