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

Scala类型边界和方差

发布时间:2020-12-16 18:38:26 所属栏目:安全 来源:网络整理
导读:我试图更好地理解以下行为: scala class C[-A,+B : A]console:7: error: contravariant type A occurs in covariant position in type : Nothing : A of type B class C[-A,+B : A] ^ 但是以下工作: scala class C[-A,+B % A]defined class C 我可以看到边
我试图更好地理解以下行为:

scala> class C[-A,+B <: A]
<console>:7: error: contravariant type A occurs in covariant position
                    in type >: Nothing <: A of type B
       class C[-A,+B <: A]
                    ^

但是以下工作:

scala> class C[-A,+B <% A]
defined class C

我可以看到边界和有界变量的方差可能存在问题,尽管我不清楚具体问题是什么.
我更不清楚为什么更改绑定到视图绑定的类型会使事情变得正常.在没有适用的隐式转换的情况下,我希望这两个定义具有大致相同的效果.如果有什么我会期望一个观点必然会提供更多的恶作剧机会.

对于一些背景,我定义了类似函数的类,我想做类似的事情

CompositeFunc[-A,+B <: C,-C,+D] (f1 : BaseFunc[A,B],f2 : BaseFunc[C,D]) 
  extends BaseFunc[A,D]

按理说

CompositeFunc[-A,+B <% C,D]

实际上是可取的,但我仍然希望更好地了解这里发生了什么.

解决方法

首先是简单的一个:

class C[-A,+B <% A]

这相当于

class C[-A,+B](implicit view: B => A)

由于视图不是公开返回的,因此它不会限制A或B的方差.

class C[-A,+B](val view: B => A)  // error: B in contravariant position in view

换句话说,就约束而言,C [-A,B <%A]与C [-A,B]没有区别,视图参数不会改变任何东西. 上限情况C [-A,B<:A]我不确定. §4.5中的Scala语言规范说明

The variance position of the lower bound of a type declaration or type parameter is the opposite of the variance position of the type declaration or parameter.

似乎没有涉及B的方差,但通常上限必须是协变的:

trait C[-A,B <: A] // contravariant type A occurs in covariant position

这必须以某种方式产生问题?但我无法想出一个例子,证明这种结构在特定情况下变得不健全……

至于组合功能,为什么不呢

class Composite[-A,B,+C](g: A => B,h: B => C) extends (A => C) {
  def apply(a: A) = h(g(a))
}

编辑:例如:

import collection.LinearSeq

def compose[A](g: Traversable[A] => IndexedSeq[A],h: Traversable[A] => LinearSeq[A]) =
  new Composite(g,h)

(编辑:李大同)

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

    推荐文章
      热点阅读