加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 类别别名中的差异注释

发布时间:2020-12-16 09:10:20 所属栏目:安全 来源:网络整理
导读:最近我注意到方差注释可以在类型别名中使用.以下是Predef的示例: type Function[-A,+B] = Function1[A,B] 我开始想,可以在哪里使用.显然,您不能将方差改为相反,或使不变类型表现为共同或逆向.编译器会抛出一个错误,像这样 scala type BrokenFunc[+T,-R] = F
最近我注意到方差注释可以在类型别名中使用.以下是Predef的示例:

type Function[-A,+B] = Function1[A,B]

我开始想,可以在哪里使用.显然,您不能将方差改为相反,或使不变类型表现为共同或逆向.编译器会抛出一个错误,像这样

scala> type BrokenFunc[+T,-R] = Function1[T,R]
<console>:7: error: covariant type T occurs in contravariant position in type 
  [+T,-R]T => R of type BrokenFunc

但是,您可以使一些变体类型的行为类似于不变式(至少编译器不会与之进行争论).所以,我试图做一个不变版本的列表

scala> type InvList[T] = List[T]
defined type alias InvList

但是这个新的不变列表仍然表现得像原始的协变版本:

scala> val l: InvList[String] = List("foo")
l: InvList[String] = List(foo)

scala> val anyList: InvList[Any] = l
anyList: InvList[Any] = List(foo)

那么,我错过了什么?类型别名中方差注释的目的是什么?你可以给出一个带有方差注释的类型别名的例子,这将与原始类型不同.

解决方法

所以,我不知道肯定,但我会提供一个可能的解释.

Scala中的类别别名相当“弱”它们不完全创建新类型,只是编写旧类型(和新路径依赖类型)的新方法;这意味着如果你定义

type InvList[T] = List[T]

并写入InvList [T],就好像你写了List [T];这就是为什么InvList [Int]<:InvList [Any],因为被重写,这只是List [Int]:列表[Any].我实际上并不确切地确定“弱”Scala类型别名是什么...他们比Haskell的一些强大,因为依赖于路径的类型,但比类声明弱.也许别人可以进一步解释. 那么,为什么Scala允许你把方差注释放在那里,如果它只是忽略它们,还是重写类型?它是类型成员.这是你可以说的

trait A { type F[+T] }

并要求这些实现符合T方差,以便允许

trait B extends A { type F[+T] = List[T] }

但不是

trait C extends A { type F[T] = Function[T,T] }

或者,从Scala Language Spec S4.3的这个句子.

A type constructor declaration imposes additional restrictions on the concrete types for which t may stand. Besides the bounds L and U,the type parameter clause may impose higher-order bounds and variances,as governed by the conformance of type constructors (§3.5.2).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读