• Scala函数---既存类型


    语法:
    Type ::= InfixType ExistentialClauses
    ExistentialClauses ::= „forSome‟ „{‟ ExistentialDcl
    {semi ExistentialDcl} „}‟
    ExistentialDcl ::= „type‟ TypeDcl
    | „val‟ ValDcl
    既存类型具有 T forSome {Q}的形式,Q是一个类型声明的序列(§4.3)。设t1[tps1]>n<:Un是Q中声明的类型(不论什么类型參数部分[tpsi]都能够没有)。

    每一个类型ti的域都包括类型T和既存子句Q。类型变量ti就称为在类型T forSome {Q}中被绑定。

    在T中可是没被绑定的类型变量就被称为在T中是自由的。
    T forSome {Q}的类的实例就是类σT,σ是t1,...,tn上的迭代,对于每个i。都有σLi<:σti<:σUi。既存类型T forSome{Q}的值的集合就是全部其类型实例值的集
    类型合的合集。
    T forSome {Q}的斯科伦化是一个类实例σT。σ是[t‟1/t1,..., t‟n/tn上的迭代,每一个t‟i是介于σLi和σUi间的新的抽象类型。


    简化规则
    既存类型遵循下面四个等效原则:
    1. 既存类型中的多个for子句能够合并。例 T forSome {Q} forSome{Q‟}等价于T forSome {Q;Q‟}
    2. 未使用的限定能够去掉。例:T forSome {Q;Q‟},可是Q‟中定义的类型没有被T或Q引用。那么该表达式可等价为 T forSome {Q}
    3. 空的限定能够丢弃。例:T forSome{}等价于T。
    4. 一个既存类型 T forSome {Q},Q中包括一个子句type t[tps] >: L <: U等价于类型 T‟ forSome {Q},T‟是将T中全部t的协变量替换为U而且将T中全部的t的逆变量替换为L的结果。
    在值上的既存量化
    为了语法上的方便。在既存类型上的绑定子句能够包含值声明 val x: T。既存类型T forSome { Q; val x: S; Q‟} 是T‟ forSome { Q; type t <: S with Singleton; Q‟}的简写形式,此处t是一个新的类型名,T‟是将T中全部x.type用t取代的结果。
    既存类型的占位符语法
    语法:
    WildcardType ::= „_‟ TypeBounds
    Scala支持既存类型的占位符语法。通配符类型的形式为 _><:U。两个边界均可忽略。

    假设下界>被忽略则用>:scala.Nothing。

    假设上界<:U被忽略则用<:scala.Any。通配符类型是既存限定类型变量的简写,既存的限定条件是内涵的。
    通配符类型仅仅能作为參数化类型的类型參量出现。设T=p.c[targs,T,tags‟]是一个參数化类型,targs,targs‟能够为空。T是一个通配符类型_><:U。

    那么T等价于下面既存类型:
    p.c[tags,t,tags‟] forSome { type t ><:U}
    t是一个新的类型变量。

    通配符类型能够作为中缀类型(§3.2.8),函数类型(§3.2.9)或元组类型(§3.2.5)的一部分出现。

    它们的扩展也就是等价參数化类型的扩展
    演示样例3.2.5 假定下面类定义:
    class Ref[T]
    abstract class Outer { type T }
    下面是一些既存类型的样例:
    Ref[T] forSome { type T <: java.lang.Number }
    Ref[x.T] forSome { val x: Outer }
    Ref[x_type # T] forSome { type x_type <: Outer with Singleton }
    非值类型
    列表中的后两个类型是等价的。使用通配符语法的还有一种形式是:
    Ref[_ <: java.lang.Number]
    Ref[(_ <: Outer with Singleton)# T]
    演示样例3.2.6 类型List[List[_]]等价于既存类型:
    List[List[t] forSome { type t }]
    演示样例3.2.7 假定有协变类型:
    class List[+T]
    类型:
    List[T] forSome { type T <: java.lang.Number }
    应用上面的第四条简化规则。上式等价于:
    List[java.lang.Number] forSome { type T <: java.lang.Number }
    假设再应用上面的第二和第三条简化规则。上式可化为:

    List[java.lang.Number]

    很多其它精彩内容请关注:http://bbs.superwu.cn

    关注超人学院微信二维码:.

    关注超人学院java免费学习交流群:

  • 相关阅读:
    javascript高级知识分析——灵活的参数
    javascript高级知识分析——实例化
    javascript高级知识分析——上下文
    javascript高级知识分析——作为对象的函数
    javascript高级知识分析——函数访问
    javascript高级知识分析——定义函数
    new到底做了什么?
    JavaScript中的计时器原理
    解析Function.prototype.bind
    将类数组对象(array-like object)转化为数组对象(Array object)
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5135153.html
Copyright © 2020-2023  润新知