美文网首页
twitter scala school 简单记录

twitter scala school 简单记录

作者: 以梦为马驾驾驾 | 来源:发表于2020-11-16 00:34 被阅读0次
    1. compose 和 andThen 如此相似,但是生成的function的顺序却不一样
    2. 为什么在filter中可以使用case ..., 因为filter函数接收一个function,而case ...是一个 partial function,是function的子类
    3. 什么是类型系统:

    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.”
    类型系统是一个语法方法,它们根据程序计算的值的种类对程序短语进行分类,通过分类结果错误行为进行自动检查。

    1. scala 中的类型系统的能力
      a. 参数化多态性:parametric polymorphism
      b. 类型推断:type inference
      c. existential qualification: 存在量化,对已有的未命名的类型进行定义
      d. views: 粗略说,将一种类型转化为另外一种类型
    2. 函数式编程语言中经典的类型推断算法是:Hindley-Milner,scala略有不同:先类型约束(局部),然后试图统一类型
    3. scala的类型系统负责解释 class 的 "hierarchies and polymorphism",类的层次和多态,通过不同的Variance:
      a. Covariant
      b. Contravariant
      c. invariant
      详细见下篇文章
    4. 使用边界来限制多态变量
    5. 当不关心参数化类型的类型的时候,可以使用通配符或者存在类型。

    高级类型:

    1. 视图约束:view bounds,我们并不需要将某个类型等于或者子类或者超类于某个类型,而是能将这个类型当成另外一个类型一样来读取,所以有了视图绑定,就像是类型A must can be viewable as B,这在需要只读取类型A的某方面尤其好用, 要实现must be viweable as B,必须存在一个隐式类型转化,可以将A转化为B。 class Container[A <% Int] ...... 然而已经被废弃。

    2. 通过类型上下界,我们可以为具有形同行为的子类们定义一个通用的方法,但如果某些类在使用上具有业务的父子类关系,但是在定义上不具有呢,如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
    
    

    不同于刚才的视图约束

    1. 上下文约束和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
    

    相关文章

      网友评论

          本文标题:twitter scala school 简单记录

          本文链接:https://www.haomeiwen.com/subject/tnoobktx.html