scala教程:类型基础-java开发java经验技巧

scala教程:类型基础-java开发java经验技巧

ID:30792144

大小:78.00 KB

页数:7页

时间:2019-01-03

scala教程:类型基础-java开发java经验技巧_第1页
scala教程:类型基础-java开发java经验技巧_第2页
scala教程:类型基础-java开发java经验技巧_第3页
scala教程:类型基础-java开发java经验技巧_第4页
scala教程:类型基础-java开发java经验技巧_第5页
资源描述:

《scala教程:类型基础-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Scala教程:类型基础-Java开发Java经验技巧Scab教程:类型基础木文作者:ImportNew・朱伟杰未经许可,禁止转载!英文原文:?SealaSchool,翻译:TmportNew?-?朱伟杰这一节的内容包含:•什么是静态类型?•Scala中的类型•参数多态•参数推导:Hindley-Milener与局部类型推导•Variance•范围(Bounds)•量化(Quantification)什么是静态类型?为什么它们很有用?根据Pierce的说法:“类型系统是一个可以根据代码段计算岀来的值对它们进行

2、分类,然后通过语法的手段来自动检测程序错误的系统。”类型可以让你表示函数的域和值域。例如,在数学里,我们经常看到下面的函数:f:R->N这个定义告诉我们函数”f”的作用是把实数集里的数映射到自然集里。抽象地说,这才是具傩、义上的类型。类型系统给了我们一些表示这些集合的更强大的方式。有了这些类型标识,编译器现在可以?静态地(在编译期)判断这个程序是正确的。换句话说,如果一个值(在运行期)不能够满足程序里的限制条件的话,那么在编译期就会出错。通常来说,类型检测器(typccheckcr)只能够保证不正确的的程序不

3、能通过编译。但是,它不能够保证所有正确的程序都能通过编译。由于类型系统的表达能力不断增加,使得我们能够生成出更加可靠的代码,因为它使得我们能够控制程序上的不可变,即是是程序还没有运行的情况下(在类型上限制bug的出现)。学术界一直在努力突破类型系统的表达能力的极限,包含值相关的类型。注意,所有的类世信息都会在编译期擦除。后而不再需要。这个被称为类型擦除。Scala中的类型Scala强大的类型系统讣我们口J以使用更具冇表现力的表达式。一些主要的特点如下:•支持参数多态,泛型编程•支持(局部)类型推导,这就是你为

4、什么不需要写vali:Int二12:Int•支持存在向量(existentialquantification).给一些没有名称的类烈定义一些操作•支持视图。我们下个星期再讨论;给定的值从一个类型到其他类型的“可转换性”参数多态多态可以用来编写泛型代码(用于处理不同类型的值),并且不会减少静态类型的表达能力。例如,没有参数多态的话,一个泛型的列表数据结构通常会是卜•面这样的写法(在Java还没冇泛型的时候,确实是这样的):scala>2::1::,zbar,z::"foo"::Nilres5:List[Any]

5、二List(2,1,bar,foo)这样的话,我们就不能够恢复每个元素的类型信息。scala>rcs5・headres6:Any二2这样一来,我们的应用里会包含一系列的类型转换(“asInstanceOf[]“),代码会缺少类型安全(因为他们都是动态类型的)。多态是通过指定类型变量來达到的。scala>defdropl[A](1:List[A])=1.taildropl:[A](1:List[A])List[A]scala>dropl(List(1,2,3))resl:List[Tnt]二List(2,3)多

6、态是scala里的一等公民简单來说,这意味着有一些你想在Scala里表达的类型概念会显得“太过于泛型”,从而导致编译器无法理解。假如你有这样一个函数:deftoList[A](a:A)二List(a)你想要按照泛型的方式來使用它:deffoo[A,B](f:A=>List[A],b:B)=f(b)但是这样会编译不过,因为所有的类型变量在运行期必须是确定的。deffoo[A](f:A=>List[A],i:Int)=f(i)•••yougetatypemismatch・…你会看到一个类型不匹配的错谋类型推导对于

7、静态类型的一个比较常见的缺陷就是冇太多的类型语法。Scala提供了类型推导来解决这个问题。函数式语言里比较经典的类型推导的方法是^Hindlry-Milnen并月•它是在ML里首先使用的。Scala的类型推导有一点点不同,不过思想上是一致的:推导所有的约束条件,然后统一到一个类型上。在Scala里,例如,你不能这样写:scala>{x=>x}:7:error:missingparametertype{x=>x}但是在OCaml里,你可以:#funx->x;;_:,a_>,a二在Scala里,所有的类型推导都是

8、局部的。Scala-次只考虑一个表达式。例如:scala>clefid[T](x:T)=xid:[T](x:T)Tscala>valx二id(322)x:Int=322scala>valx=id(〃hey〃)x:java.lang.String二heyscala>valx=id(Array(1,2,3,4))x:Array[Int]=Array(1,2,3,4)在这里,类型都被隐藏了。Scala编译

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。