- compose 和 andThen 如此相似,但是生成的function的顺序却不一样
- 为什么在filter中可以使用case ..., 因为filter函数接收一个function,而case ...是一个 partial function,是function的子类
- 什么是类型系统:
According to Pierce: “A type system is a syntactic method for automatically checking the absence of certain erroneous behaviors by classifying program phrases according to the kinds of values they compute.”
类型系统是一个语法方法,它们根据程序计算的值的种类对程序短语进行分类,通过分类结果错误行为进行自动检查。
- scala 中的类型系统的能力
a. 参数化多态性:parametric polymorphism
b. 类型推断:type inference
c. existential qualification: 存在量化,对已有的未命名的类型进行定义
d. views: 粗略说,将一种类型转化为另外一种类型 - 函数式编程语言中经典的类型推断算法是:Hindley-Milner,scala略有不同:先类型约束(局部),然后试图统一类型
- scala的类型系统负责解释 class 的 "hierarchies and polymorphism",类的层次和多态,通过不同的Variance:
a. Covariant
b. Contravariant
c. invariant
详细见下篇文章 - 使用边界来限制多态变量
- 当不关心参数化类型的类型的时候,可以使用通配符或者存在类型。
高级类型:
-
视图约束:view bounds,我们并不需要将某个类型等于或者子类或者超类于某个类型,而是能将这个类型当成另外一个类型一样来读取,所以有了视图绑定,就像是类型A must can be viewable as B,这在需要只读取类型A的某方面尤其好用, 要实现must be viweable as B,必须存在一个隐式类型转化,可以将A转化为B。 class Container[A <% Int] ...... 然而已经被废弃。
-
通过类型上下界,我们可以为具有形同行为的子类们定义一个通用的方法,但如果某些类在使用上具有业务的父子类关系,但是在定义上不具有呢,如scala的数字类型不共享一个父类,但是我们想定义一个通用的方法来求最大或者最小(def min[ T <: Numner] 是错误的),那么就要使用使用隐式参数+隐式转换+类型约束 或者 上下文约束 来完成这件事,如:
scala.collection.TraversableOnce#min
def min[B >: A] (implicit cmp: Ordering[B]) : A = {
if (isEmpty)
throw new UnsupportedOperationException("empty.min")
reduceLeft( (x, y) => if (cmp.lteq(x, y)) x else y)
}
这样的好处和优点是:
1. 集合类的元素可以不用事先实现Ordered接口
2. 用的时候可以传入不同的 Ordering ,不传则在LowPriorityOrderingImplicits中有隐式转换将Ordered转化为Ordering
不同于刚才的视图约束
- 上下文约束和implicity[]:上面的写法还是略显啰嗦,于是scala在2.8的时候引入了context bound ,[ T : M] 其中M是一个泛型类型,整体是要求上下文中有一个类型为M[T]的泛型类实例的隐式值。
class Pair[T : Ordering] 被实例化的时候,会去上下文,伴生对象等寻找Ordering[XXX]的示例,找到后便注入,这个隐式值便成为了这个实例化类的值,当方法需要用到它的时候,便可以传入方法(def me(implicit cam:Ordering[xxx])的隐式参数中,或者在方法中主动使用implicity[xxx]获得
另外:由一下可以知道, 这其实是一种语法糖
scala> def min[ T: Ordering] = {}
min: [T](implicit evidence$1: Ordering[T])Unit
scala> def mai[T:Ordering](x:T,y:T) = x
mai: [T](x: T, y: T)(implicit evidence$1: Ordering[T])T
scala>
def maii[T:Ordering](x:T,y:T) = {
import Ordered._;
if(x < y) x else y
}
maii: [T](x: T, y: T)(implicit evidence$1: Ordering[T])T
网友评论