我试图弄清楚如何编写一个适用于 any 的功能交换函数Traversable[_]
,给定一个集合和要交换的索引。我想出了以下内容:
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)
我想知道如何使它成为 Traversable 的隐式扩展,使我能够使用List(1,2,3,4,5).swap(0, 4)
. 我能得到的最接近的是以下内容:
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)
不幸的是,这还不是。调用List(1,2,3,4,5).swap(0, 4)
导致以下错误:
错误:List[Int] => Traversable[A] 没有可用的隐式视图
我觉得我一定遗漏了一些东西,或者使问题过于复杂化。有谁知道这应该如何构建?
注意:这纯粹是学术性的,不会以任何方式在生产环境中使用。我试图更好地处理 Scala 的类型系统和边界。