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

斯卡拉 – 这可以简化吗?

发布时间:2020-12-16 19:24:10 所属栏目:安全 来源:网络整理
导读:参考 previous answer of mine on stackoverflow 复杂性的核心只用一种方法说明: implicit def traversableToFilterOps[CC[X] : Traversable[X],T](xs: CC[T])(implicit witness: CC[T] : TraversableLike[T,CC[T]]) = new MoreFilterOperations[CC[T],T](x
参考 previous answer of mine on stackoverflow

复杂性的核心只用一种方法说明:

implicit def traversableToFilterOps[CC[X] <: Traversable[X],T]
(xs: CC[T])(implicit witness: CC[T] <:< TraversableLike[T,CC[T]]) =
  new MoreFilterOperations[CC[T],T](xs)

有两个问题:

>有没有办法让编译器提示Map符合签名CC [X]<:Traversable [X]?
我希望它匹配为Traversable [Tuple2 [_,_]],但这不会发生.最后,我不得不写第二种采用CC [KX,VX]<:Map [KX,VX]的方法,但这感觉多余
>见证人:CC [T]<:<鉴于第一个类型参数,TraversableLike [T,CC [T]]似乎也是多余的,我的直觉是这是由Traversable的类型强制执行的,并且对于任何可能的子类或X的值必须始终为true,所以应该没有明确要求它作为证人的理由.
如果我在REPL中使用存在类型测试它,那么编译器似乎同意我:

scala> implicitly[Traversable[X] <:< TraversableLike[X,Traversable[X]] forSome { type X }]
res8: <:<[Traversable[X],scala.collection.TraversableLike[X,Traversable[X]]] forSome { type X } = <function1>

因此,有没有办法取消样板?

解决方法

我是Scala noob,所以如果这没有用,请不要把我击倒.

假设这个:

class MoreFilterOperations[Repr <% TraversableLike[T,Repr],T] (xs: Repr) {}

会这样的吗?

// t2fo is short for traversableToFilterOps
implicit def t2fo[Repr <% TraversableLike[T,T](xs: Repr) = 
  new MoreFilterOperations[Repr,T](xs)

// m2fo is short for mapToFilterOps
implicit def m2fo[Repr <% Map[K,V] <% TraversableLike[(K,V),K,V]
  (xs: Repr) = new MoreFilterOperations[Repr,(K,V)](xs)

这应该工作,因为(根据我的书..编程Scala,p264)以下方法定义与视图绑定:

def m [A <% B](arglist): R = ...

它实际上与此方法定义相同:

def m [A](arglist)(implicit viewAB: A => B): R = ...

(编辑:李大同)

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

    推荐文章
      热点阅读