`
edge
  • 浏览: 66548 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
路径依赖类型(Path-dependent types) 不知道AbsCell绑定的类型情况下,也可以对其进行访问。下面这段代码将一个cell的值恢复成为其初始值(init),而无需关心cell值的类型是什么。 def reset(c: AbsCell): unit = c.set(c.init) 为什么可以这样 ...
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
头一次参加这种东东,最大的收获就是认识了很多、很多人,总得有十个八个吧 ——不比别人啊,我交往的人少,一下子认识十个八个,顶我好几年增加的交往数量了。十年没见的老朋友也见了两个,听说我没怎么变样,高兴啊,就爱听这个   聊天还是老几位,一如既往的狂喷几个小时,一次凌晨两点,一次三点。继续被孟岩引导空谈我爱大清国自然是免不了的,除此之外,我正式展开了语义学解释一切的套路,得到的反应似乎主要有三种:点头、困了、怒了。   内容方面嘛,有些还可以,听说去年的内容更丰富一点,没去过,没比较。总算看了老宋他们那个X5的全貌,国内做这种的应该还是很多,相信他们的应该属于比较不错的。
二元操作和参数下界(Binary methods and lower bounds)迄今为止,我们一直将协变性与不可变数据结构联系在一起,然而由于二元操作(Binary methods,就是指一个对象的方法,其参数类型也是这个对象类型,例如:x+y这种——译注)的 ...
参数限定(Parameter bounds)考虑这样一个方法:updateMax,他将一个cell的值设置为其当前值与一个给定值之间较大的那个。我们希望这个函数能够作用于所有的cell类型,只要其值类型能够按照一个特征(trait)Ordered定义的“<”操作符进行比较。目前假定这个特征定义如下:(更精确的定义在Scala标准类库中) trait Ordered[T] { def < (x: T): boolean } 这样,updateMax方法可以通过如下方式进行泛型定义,其中使用到的方法称为限定多态(Bounded polymorphism): def updateMax[T ...
5.       抽象(Abstraction) 在组件系统中,一个重要的议题就是如何抽象所需的组件。编程语言当中有两种最主要的抽象方式:参数化和抽象成员。前一种主要是函数式抽象方式,而后一种主要是面向对象的方式。传统意义上,Java对值提供函数式抽象,而对操作提供面向对象的抽象。Java 5.0所支持的泛型,对类型也提供了一定的函数式抽象。 Scala对于值和类型提供上述两者抽象模式的统一支持,值和类型都可以作为参数,也可以作为抽象成员。本节对这两种模式进行讨论,并且对Scala类型系统的很大一部分进行回顾。 5.1.    函数式抽象(Functional Abstraction
4.4.  序列(Sequences) 高阶函数的使用是序列处理时的一个普遍特点。Scala类库定义了几种不同类型的序列:数组(arrays)、列表(lists)、流(streams)和迭代器(iterators)。所有的序列都继承自特征(trait):Scala.Seq;从而都定义了一套方法使得相应处理更简介、高效。例如:map方法将一个函数应用于一个序列的所有元素,产生一个以相应结果为元素的序列。另一个例子是filter方法,将一个断言(predicate)函数应用于所有的元素,产生一个由所有使该断言为真的元素组成的序列。 下面这个sqrts函数展示了上述两个方法的使用,它以一个双精度浮点数 ...
4.2.    函数也是对象(Functions are Objects) 既然方法是值,值是对象,方法当然也就是对象。实际上,函数类型和函数值(注意:指函数本身作为值——译注)只不过是相应的类及其实例的语法糖衣。函数类型S=>T等价于参数化类型scala.Function1[S, T],这个类型定义在Scala标准类库中: package scala abstract class Function1[-S,+T] { def apply(x: S): T }        参数超过一个的函数也可类似地定义,一般而言,
4.       操作也是对象(Operations Are Objects) Scala是一种函数式编程语言,也就是说每一个函数都是一个值。Scala有很简洁的语法用于定义匿名和curry化函数(curried function,functional programming的概念之一,名字源于Haskell Curry,Haske ...
3.3.    变量和属性(Variables and Properties) 如果所有操作都是方法调用,那么变量引用(dereferencing)和赋值语句呢?实际上,如果这两种操作是针对类成员变量,那么也是被解释为方法调用的。对于所有类成员变量x:T,Scala这样定义其getter和setter: def x:T def x_=(new val:T):unit 这些方法引用和更新一个可修改(mutable)的内存单元,它不能被Scala程序直接访问。每一次x这个名称被引用,都会导致调用x这个无参数方法,同样,每次调用赋值语句:x=e,都是x_=(e) 这样一个方法调用。
某些Scala的操作符并不总对所有参数求值,例如标准布尔操作符&&和||,这种操作符也可以是方法调用,因为Scala的参数是允许传名的。下面是一个Bool类,模拟系统内建的布尔类型。 abstract class Bool {   def && (x: => Bool): Bool   def
3.2.    操作(Operations) Scala统一对象模型的另一个方面体现为每一个操作都是一个消息传递,也就是说是一个方法调用。例如:x与y相加操作x+y被解释为x.+y,也就是调用x这个对象的方法+,而y是该方法的参数。这种思想最早在
3.       统一的对象模型 Scala采用了一种纯粹的面向对象的模型,如同Smalltalk一样:每一个值都是对象,每一个操作都是消息传递。   3.1.    类(Classes)  图1(原文为Figure 2,但图上是Figure 1——译注)展示了
2.       一种类似 Java 的语言 Scala 被设计成为可以与主流平台很好的交互,包括 Java 和 C# 。因此其绝大部分的基本操作符、数据类型和控制逻辑都与这两种语言相同。为简单起见,后面我们仅将 Scala 与 Java 作对比,由于 Java 与 C# 本身就有很多共同点,因此 Scala 绝大部分与 Java 的相似之处都可直接应用于 C# 。其实有些情况下 Scala 甚至更接近 C# ,例如对泛型的处理方面。
摘要 Scala 是一种融合了面向对象和函数式编程的静态类型语言,他被定位为构建组件及组件系统。本文是 Scala 语言的概述,适合于理解编程方法和熟悉程序语言设计的读者阅读。 1.       简介 真正的组件系统,一直是软件业一个虚幻( elusive )的目标。从理想的角度看,软件应该可以使用组件库中预先设计好组件的构建,一如硬件可以用预制的芯片进行组装。然而现实中,任何软件中都有很大一部分是用“从头开始”( “ from scratch ” )的方式编写的,正因为如此,软件开发迄今为止仍然是一种工艺( Craft )而没有成为工业。 这里所说的组件是指软件的某种部件( parts ...
Global site tag (gtag.js) - Google Analytics