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)))
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.