Scala:具有可遍历值的映射的隐式证据?

Scala:具有可遍历值的映射的隐式证据?,scala,collections,Scala,Collections,我正在尝试编写一个通用的invert方法,该方法将a类型的键映射到B类型的集合,并使用相同的原始集合类型将其转换为具有B类型的键和a类型集合的映射 我的目标是使此方法成为提供基本库方法扩展的MyMap[a,B]类的成员,其中Maps隐式转换为MyMaps。我可以对泛型映射进行这种隐式转换,但是我想进一步指定invert方法应该只在B是一个集合的情况下工作 我对scala的集合框架缺乏了解,无法实现这一点——我已经在网上搜寻了关于签名的全面介绍性解释,这些签名看起来像是一个大杂烩,包括Repr、C

我正在尝试编写一个通用的
invert
方法,该方法将
a
类型的键映射到
B
类型的集合,并使用相同的原始集合类型将其转换为具有
B
类型的键和
a
类型集合的映射

我的目标是使此方法成为提供基本库方法扩展的
MyMap[a,B]
类的成员,其中
Map
s隐式转换为
MyMap
s。我可以对泛型映射进行这种隐式转换,但是我想进一步指定
invert
方法应该只在
B
是一个集合的情况下工作

我对scala的集合框架缺乏了解,无法实现这一点——我已经在网上搜寻了关于签名的全面介绍性解释,这些签名看起来像是一个大杂烩,包括
Repr
CC
that
、以及
CanBuildFrom
,但是我真的不明白所有这些部分是如何很好地结合在一起,以便自己构造方法签名的。请不要只是给我这个案例的工作签名——我想了解使用泛型集合的方法的签名在更广泛的意义上是如何工作的,这样我就能够独立地继续下去。或者,请随意参考一个详细阐述这一点的在线资源——我找不到一个全面而清晰的资源

编辑

我似乎已经让它与以下代码一起工作。如果我做错了什么,或者你看到了一些可以改进的地方,请用一个更好的选择来评论和回答

class MyMap[A, B](val _map: Map[A, B]) {
  def invert[E, CC[E]](
    implicit ev1: B =:= CC[E],
    ev2: CC[E] <:< TraversableOnce[E],
    cbf: CanBuildFrom[CC[A], A, CC[A]]
  ): Map[E, CC[A]] = {
    val inverted = scala.collection.mutable.Map.empty[E, Builder[A, CC[A]]]
    for {
      (key, values) <- _map
      value <- values.asInstanceOf[CC[E]]
    } {
      if (!inverted.contains(value)) {
        inverted += (value -> cbf())
      }
      inverted.get(value).foreach(_ += key)
    }
    return inverted.map({ case (k,v) => (k -> v.result) }).toMap
  }
}
classmymap[A,B](val\u-map:map[A,B]){
def反转[E,CC[E]](
隐式ev1:B=:=CC[E],
ev2:CC[E]v.result}).toMap
}
}

我从您的代码开始,最后得出以下结论:

implicit class MyMap[A, B, C[B] <: Traversable[B]](val _map: Map[A, C[B]]) {

  def invert(implicit cbf: CanBuildFrom[C[A], A, C[A]]): Map[B, C[A]] = {
    val inverted = scala.collection.mutable.Map.empty[B, Builder[A, C[A]]]
    for ((k, vs) <- _map; v <- vs) {
      inverted.getOrElseUpdate(v, cbf()) += k
    }

    inverted.map({ case (k, v) => (k -> v.result)}).toMap
  }
}

val map = Map("a"-> List(1,2,3), "b" -> List(1,2))

println(map.invert) //Map(2 -> List(a, b), 1 -> List(a, b), 3 -> List(a))
隐式类MyMap[A,B,C[B]列表(1,2,3),“B”->List(1,2))
println(map.invert)//map(2->List(a,b),1->List(a,b),3->List(a))

我希望该类具有足够的通用性,能够处理任何类型的映射,因此我可以向映射添加其他扩展。我只希望特定的
invert
方法具有附加要求,即
B
是一个集合。