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 の型システムと境界をうまく扱えるようにしています。