干将莫邪
iteye_20990
这个作者很懒,什么都没留下…
展开
-
Scala概述(五)抽象(2)
5.2 抽象成员(Abstraction Members) 在Scala中,面向对象的抽象方式可以与函数式抽象起到同样的作用。例如:下例是一个以OO抽象方式定义的Cell类型。 abstract class AbsCell { type T val init: T private var value: T = init def get: T = value def set(x: T): un...2008-12-22 22:00:05 · 90 阅读 · 0 评论 -
Scala概述(四)操作也是对象(1)
4. 操作也是对象(Operations Are Objects) Scala是一种函数式编程语言,也就是说每一个函数都是一个值。Scala有很简洁的语法用于定义匿名和curry化函数(curried function,functional programming的概念之一,名字源于Haskell Curry,Haskell的发明者,一般都不翻译。本文后面并没有针对这个概念的解释和实现...2008-09-28 22:40:34 · 109 阅读 · 0 评论 -
Scala概述(四)操作也是对象(2、3)
4.2. 函数也是对象(Functions are Objects) 既然方法是值,值是对象,方法当然也就是对象。实际上,函数类型和函数值(注意:指函数本身作为值——译注)只不过是相应的类及其实例的语法糖衣。函数类型S=>T等价于参数化类型scala.Function1[S, T],这个类型定义在Scala标准类库中: package scala abstract class Func...2008-10-06 13:12:45 · 125 阅读 · 0 评论 -
Scala概述(六)合成
6. 合成(composition) 解释了Scala的类型抽象体系之后,本节主要描述类的合成方式(译注:class composition似乎也没有固定的译法,此处翻译成“合成”)。Scala的基于混入的类合成(mixin class composition)体系是Brach[6]中的面向对象的线性混入合成(linear mixin compostion)和[14、25]中提出...2009-06-28 19:49:09 · 124 阅读 · 0 评论 -
Scala概述(四)操作也是对象(4、5)
4.4. 序列(Sequences) 高阶函数的使用是序列处理时的一个普遍特点。Scala类库定义了几种不同类型的序列:数组(arrays)、列表(lists)、流(streams)和迭代器(iterators)。所有的序列都继承自特征(trait):Scala.Seq;从而都定义了一套方法使得相应处理更简介、高效。例如:map方法将一个函数应用于一个序列的所有元素,产生一个以相应结果为元素的序...2008-10-21 21:52:58 · 94 阅读 · 0 评论 -
Scala概述(五)抽象(1)
5. 抽象(Abstraction) 在组件系统中,一个重要的议题就是如何抽象所需的组件。编程语言当中有两种最主要的抽象方式:参数化和抽象成员。前一种主要是函数式抽象方式,而后一种主要是面向对象的方式。传统意义上,Java对值提供函数式抽象,而对操作提供面向对象的抽象。Java 5.0所支持的泛型,对类型也提供了一定的函数式抽象。 Scala对于值和类型提供上述两者抽象模式的统一支持,...2008-10-30 23:02:33 · 105 阅读 · 0 评论 -
Scala概述(五)抽象(1.1、1.2)
参数限定(Parameter bounds)考虑这样一个方法:updateMax,他将一个cell的值设置为其当前值与一个给定值之间较大的那个。我们希望这个函数能够作用于所有的cell类型,只要其值类型能够按照一个特征(trait)Ordered定义的“<”操作符进行比较。目前假定这个特征定义如下:(更精确的定义在Scala标准类库中) trait Ordered[T] { def <...2008-11-02 11:52:34 · 86 阅读 · 0 评论 -
Scala概述(五)抽象(1.3、1.4)
二元操作和参数下界(Binary methods and lower bounds)迄今为止,我们一直将协变性与不可变数据结构联系在一起,然而由于二元操作(Binary methods,就是指一个对象的方法,其参数类型也是这个对象类型,例如:x+y这种——译注)的存在,这种做法并不完全正确。例如,为GenList类增加一个prepend(前追加)方法,最自然的做法是将其定义成为接收一个相应的lis...2008-11-04 22:48:32 · 104 阅读 · 0 评论 -
Scala概述(六)合成(2)
成员(Membership ) 如前所示,Iter 类从StringIterator 和RichIterator 同时继承了类成员(members )。简单而言,一个类从以混入合成方式继承Cn with … with C1 ,将会继承其中所有类的成员,同时还可以自定义新的成员。由于Scala 保留了Java 和C# 的静态重载机制,因此可能从父类继承同名的方法...2009-08-02 00:46:29 · 110 阅读 · 0 评论 -
Scala概述(三)统一的对象模型(3)
3.3. 变量和属性(Variables and Properties) 如果所有操作都是方法调用,那么变量引用(dereferencing)和赋值语句呢?实际上,如果这两种操作是针对类成员变量,那么也是被解释为方法调用的。对于所有类成员变量x:T,Scala这样定义其getter和setter: def x:T def x_=(new val:T):unit 这些方法引用和更新一个可修改(...2008-09-26 12:51:06 · 97 阅读 · 0 评论 -
Scala概述(三)统一的对象模型(2)续
某些Scala的操作符并不总对所有参数求值,例如标准布尔操作符&&和||,这种操作符也可以是方法调用,因为Scala的参数是允许传名的。下面是一个Bool类,模拟系统内建的布尔类型。 abstract class Bool { def && (x: => Bool): Bool def || (x: => Bool): Bool } 在这个类中,...2008-09-25 00:04:26 · 81 阅读 · 0 评论 -
Scala概述(五)抽象(2.1、2.2)
路径依赖类型(Path-dependent types) 不知道AbsCell绑定的类型情况下,也可以对其进行访问。下面这段代码将一个cell的值恢复成为其初始值(init),而无需关心cell值的类型是什么。 def reset(c: AbsCell): unit = c.set(c.init) 为什么可以这样做呢?因为c.init的类型是c.T,而c.set是c.T=>unit类型的函数...2008-12-22 22:33:24 · 122 阅读 · 0 评论 -
Scala概述(五)抽象(2.3)
族多态和self类型(Family polymorphism and self types.)Scala的抽象类型概念非常适合于描述相互之间协变的一族(families)类型,这种概念称作族多态。例如:考虑发布/订阅模式,它有两个主要类型:subjects和observers。Subjects定义了subscribe方法,用于给observers进行注册,同时还有一个publish方法,用于通知所...2008-12-31 17:04:43 · 92 阅读 · 0 评论 -
Scala概述(五)抽象(3)
5.3 用抽象类型建立泛型模型(Modeling Generics with Abstract Types) 一种语言里有两套抽象语法体系肯定会让人产生对这种语言复杂性的疑问:能不能就用一种形式化体系来实现?本节当中我们将会展示,函数式的类型抽象机制(也就是泛型)实际上可以通过面向对象的类型抽象机制(也就是抽象类型)来表达。这种表达方式的思路如下所述: 假定一个参数化类型C有一个类型参数t(可...2009-03-13 20:24:39 · 109 阅读 · 0 评论 -
Scala概述(译序)
Scala概述(An Overview of the Scala Programming Language)是瑞士洛桑联邦理工学院(EPFL)的程序设计实验室的Scala发明者们写的一篇TR,针对现行的Scala版本。由于要对这种语言进行比较完整的描述,篇幅又不太长,因此学术味有点浓,而且部分内容略显简略、杂乱。但是,我仍然感觉这篇文章是长期以来看到过的对一门语言介绍最完整、清晰的文章,不但让人对...2008-09-19 16:39:49 · 84 阅读 · 0 评论 -
Scala概述(一)简介
摘要 Scala 是一种融合了面向对象和函数式编程的静态类型语言,他被定位为构建组件及组件系统。本文是 Scala 语言的概述,适合于理解编程方法和熟悉程序语言设计的读者阅读。 1. 简介 真正的组件系统,一直是软件业一个虚幻( elusive )的目标。从理想的角度看,软件应该可以使用组件库中预先设计好组件的构建,一如硬件可以用预制的芯片进行组装。然而现实中,任何软件中都有很大...2008-09-19 16:43:49 · 199 阅读 · 0 评论 -
Scala概述(二)一种类似Java的语言
2. 一种类似 Java 的语言 Scala 被设计成为可以与主流平台很好的交互,包括 Java 和 C# 。因此其绝大部分的基本操作符、数据类型和控制逻辑都与这两种语言相同。为简单起见,后面我们仅将 Scala 与 Java 作对比,由于 Java 与 C# 本身就有很多共同点,因此 Scala 绝大部分与 Java 的相似之处都可直接应用于 C# 。其实有些情况下 Scala ...2008-09-21 12:54:38 · 192 阅读 · 0 评论 -
Scala概述(三)统一的对象模型(1)
3. 统一的对象模型 Scala采用了一种纯粹的面向对象的模型,如同Smalltalk一样:每一个值都是对象,每一个操作都是消息传递。 3.1. 类(Classes) 图1(原文为Figure 2,但图上是Figure 1——译注)展示了Scala的类层次结构。每一个类都继承自scala.Any,Any的子类可以划分为两个主要范畴(Categories),值类型(value...2008-09-22 23:52:10 · 99 阅读 · 0 评论 -
Scala概述(三)统一的对象模型(2)
3.2. 操作(Operations) Scala统一对象模型的另一个方面体现为每一个操作都是一个消息传递,也就是说是一个方法调用。例如:x与y相加操作x+y被解释为x.+y,也就是调用x这个对象的方法+,而y是该方法的参数。这种思想最早在Smalltalk中实现,在Scala中得到进一步改进,形成如下语法规约:首先,Scala将操作符作为普通标识符,也就是说,任何标识符或者以字母开头的一串...2008-09-24 23:58:21 · 108 阅读 · 0 评论 -
Scala概述(六)合成(3.总结)
面向服务的组件模型(Service-Oriented Component Model) 在Scala中,类的抽象与合成机制可以被视作面向服务的组件模型的基础。软件组件是一个个有明确定义的,提供特定服务的计算单元。一般而言,一个软件组件并不是完全自含的,也就是说它的实现依赖于其他一系列提供相应服务的组件。 在Scala中,软件组件即对应着类和trait,类和trait的具体成员相当于他们获得的服...原创 2012-07-15 02:00:01 · 113 阅读 · 0 评论