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

为什么我需要一个明确的证据类型/为什么这个Scala类型绑定失败?

发布时间:2020-12-16 18:19:52 所属栏目:安全 来源:网络整理
导读:下面,第一个案例成功,第二个案例失败.为什么我需要一个明确的证据类型/为什么这个 Scala类型绑定失败?在解决A时,类型推断器的特殊限制是什么? scala implicit def view[A,C](xs: C)(implicit ev: C : Iterable[A]) = new { def bar = 0 } view: [A,C](xs:
下面,第一个案例成功,第二个案例失败.为什么我需要一个明确的证据类型/为什么这个 Scala类型绑定失败?在解决A时,类型推断器的特殊限制是什么?

scala> implicit def view[A,C](xs: C)(implicit ev: C <:< Iterable[A]) = new { def bar = 0 } 
view: [A,C](xs: C)(implicit ev: <:<[C,scala.collection.immutable.Iterable[A]])java.lang.Object{def bar: Int}

scala> view(List(1)) bar
res37: Int = 0

scala> implicit def view[A,C <: Seq[A]](xs: C) = new { def bar = 0 } 
view: [A,C <: scala.collection.immutable.Seq[A]](xs: C)java.lang.Object{def bar: Int}

scala> view(List(1)) bar
<console>:149: error: inferred type arguments [Nothing,List[Int]] do not conform to method view's type parameter bounds [A,C <: scala.collection.immutable.Seq[A]]
              view(List(1)) bar
              ^

解决方法

遗憾的是,类型推断不能很好地处理由相同类型参数列表(此处为A)中的(包含)其他类型参数的类型限制的类型参数(例如C).

使用隐式参数对约束进行编码的版本不受此限制的影响,因为由implicits施加的约束与类型参数边界强加的约束分开求解.

您还可以通过将xs类型拆分为在集合(CC)上抽象的类型构造函数和在其元素上抽象的(适当)类型(A)来避免循环,如下所示:

scala> implicit def view[A,CC[x] <: Seq[x]](xs: CC[A]) = new { def bar = 0 } 
view: [A,CC[x] <: Seq[x]](xs: CC[A])Object{def bar: Int}

scala> view(List(1)) bar
res0: Int = 0

有关CC等类型的更多详细信息,请参阅What is a higher kinded type in Scala?

(编辑:李大同)

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

    推荐文章
      热点阅读