Converting from the list [Vector [T]] to vector [List [T]] in the general way

I'm trying to figure out if I can convert List(Vector(1), Vector(2,3)) to Vector(List(1), List(2,3)) or any two intersecting classes in general.

This is what I have so far:

 import collection.generic.CanBuildFrom import collection.breakOut import collection.mutable.ListBuffer def f[A, CC[X] <: Traversable[X], DD[Y] <: Traversable[Y]](outer: DD[CC[A]]) (implicit cbf1: CanBuildFrom[Traversable[_], A, DD[A]], cbf2: CanBuildFrom[Traversable[_], DD[A], CC[DD[A]]]) : CC[DD[A]] = { val builder2 = cbf2() outer.foreach { inner => val builder1 = cbf1() builder1 ++= inner builder2 += builder1.result } builder2.result } f(Vector(List(1), List(2,3)))(breakOut, breakOut) f(ListBuffer(Vector(1), Vector(2,3)))(breakOut, breakOut) 

If I remove breakOut it will not compile:

 f(Vector(List(1), List(2,3))) // won't work 

could not find implicit value for cbf1 parameter: scala.collection.generic.CanBuildFrom [Traversable [_], Int, scala.collection.immutable.Vector [Int]]

Are there any implications that I can import? Any other way to approach this issue that won't require breakOut?


edit based on retronym answer:

 import scalaz.CanBuildAnySelf def f[A, CC[X] <: Traversable[X] : CanBuildAnySelf, DD[Y] <: Traversable[Y] : CanBuildAnySelf](outer: DD[CC[A]]) : CC[DD[A]] = { val builder2 = implicitly[CanBuildAnySelf[CC]].builder[DD[A], DD[A]].apply() outer.foreach { inner => val builder1 = implicitly[CanBuildAnySelf[DD]].builder[A, A].apply() builder1 ++= inner builder2 += builder1.result } builder2.result } 

It's nice to see that binding to CanBuildAnySelf can be used completely separately.

+4
source share
2 answers

We do this in Scalas, so this is possible.

 scala> import scalaz._ import scalaz._ scala> import Scalaz._ import Scalaz._ scala> List(Vector(1, 2, 3)).sequence res1: scala.collection.immutable.Vector[List[Int]] = Vector(List(1, 2, 3), List(1, 2, 3), List(1, 2, 3)) scala> Seq(List(1), List(3)).sequence res2: List[Seq[Int]] = List(List(1, 3)) scala> Vector(ArraySeq(1, 2, 3)).sequence res3: scala.collection.mutable.ArraySeq[scala.collection.immutable.Vector[Int]] = ArraySeq(Vector(1, 2, 3), Vector(1, 2, 3), Vector(1, 2, 3)) 

We consider only “good” collections, that is, those that may contain arbitrary types of elements, unlike BitSet . This is evidenced by https://github.com/scalaz/scalaz/blob/master/core/src/main/scala/scalaz/CanBuildAnySelf.scala

+5
source

It works:

 val l = List(Vector(1), Vector(2, 3)) val v = Vector((for (v <- l) yield v.toList): _*) 
0
source

Source: https://habr.com/ru/post/1342549/


All Articles