Scala 丰富我的库中的所有可遍历项

Scala 丰富我的库中的所有可遍历项,scala,types,implicit,enrich-my-library,Scala,Types,Implicit,Enrich My Library,我试图弄清楚如何编写一个函数交换函数,在给定要交换的集合和索引的情况下,该函数可以在任何可遍历的[\u]上工作。我得出了以下结论: def swap[A, CC <% Traversable[A]](xs: CC, i: Int, j: Int): Traversable[A] = { xs.slice(0, i) ++ xs.slice(j, j+1) ++ xs.slice(i+1, j) ++ xs.slice(i, i+1) ++ xs.

我试图弄清楚如何编写一个函数交换函数,在给定要交换的集合和索引的情况下,该函数可以在任何
可遍历的[\u]
上工作。我得出了以下结论:

def swap[A, CC <% Traversable[A]](xs: CC, i: Int, j: Int): Traversable[A] = {
  xs.slice(0, i) ++ 
    xs.slice(j, j+1) ++ 
    xs.slice(i+1, j) ++ 
    xs.slice(i, i+1) ++ 
    xs.slice(j+1, xs.size)
}

swap(List(1,2,3,4,5), 0, 4) // => List(5,2,3,4,1)
import language.implicitConversions
class RichTraversable[A, B <% Traversable[A]](xs: B) {
  def swap(i: Int, j: Int): Traversable[A] = {
    xs.slice(0, i) ++ 
      xs.slice(j, j+1) ++ 
      xs.slice(i+1, j) ++ 
      xs.slice(i, i+1) ++ 
      xs.slice(j+1, xs.size)
  }
} 
implicit def richTraversable[A, B <% Traversable[A]](ys: B)(implicit b: Traversable[A])
  = new RichTraversable[A, B](ys)
不幸的是,事实并非如此。调用
列表(1,2,3,4,5)。交换(0,4)
会导致以下错误:

错误:列表[Int]=>Traversable[A]中没有可用的隐式视图

我觉得我肯定错过了什么,或者把问题复杂化了。有人知道这应该如何组织吗



注意:这纯粹是学术性的,不以任何方式用于生产环境。我正在尝试更好地处理Scala的类型系统和边界。

如果您使用的是Scala 2.10:

import scala.collection.generic.CanBuildFrom
import scala.collection.TraversableLike

implicit class TraversableWithSwap[A, Repr <: Traversable[A]](val xs: TraversableLike[A, Repr]) extends AnyVal {
  def swap[That](i: Int, j: Int)(implicit bf: CanBuildFrom[Repr, A, That]): That = {
    val builder = bf(xs.asInstanceOf[Repr])
    builder.sizeHint(xs)
    builder ++= xs.take(i)
    builder ++= xs.slice(j, j + 1)
    builder ++= xs.slice(i + 1, j)
    builder ++= xs.slice(i, i + 1)
    builder ++= xs.drop(j + 1)
    builder.result
  }
}
使用它:

scala> Vector(1,2,3,4,5,6,7,8,9).swap(2,5)
res0: scala.collection.immutable.Vector[Int] = Vector(1, 2, 6, 4, 5, 3, 7, 8, 9)
请注意,为所有可遍历的
定义此函数实际上没有意义,因为某些可遍历项(如
Set
Map
等)是无序的,因此交换两个元素是没有意义的。实际上,您可能希望为所有
Seq
或其他内容定义它


另外:我们是否也可以把它称为“增强我的库”呢?

首先:哇,这个我从未见过的构建器是什么?第二:是的,我们可以同意从现在起称之为=)构建器是内部集合中使用的。看,例如:嗯,我找不到CanBuildFrom或TraversableLike。我缺少一个导入项吗?是的,你必须导入这些。请参阅我的编辑。顺便说一下:如果您需要查找要导入的类,您可以在API中找到它:。谢谢。我确实查看了API,但不知何故,我错过了最上面的一行,没有找到正确的软件包。我想再次+1你,但唉,我不能。
scala> Vector(1,2,3,4,5,6,7,8,9).swap(2,5)
res0: scala.collection.immutable.Vector[Int] = Vector(1, 2, 6, 4, 5, 3, 7, 8, 9)