我試圖弄清楚如何編寫一個功能交換函數,該函數可以在任何Traversable[_]
上工作,給定一個集合和交換索引。我想出了以下情況:Enrich-My-Library對於所有遍歷器
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)
導致以下錯誤:
error: No implicit view available from List[Int] => Traversable[A]
我覺得我必須失去了一些東西,或者大大過於複雜的問題。有誰知道這應該如何構造?
注:這是純學術性的,沒有在生產環境中以任何方式使用。我試圖更好地處理Scala的類型系統和邊界。
第一:哇,這是我從未見過的建造者?第二:是的,我們可以同意從現在開始= = – KChaloux
建造者是內部集合中使用的東西。例如,請參閱:https://github.com/scala/scala/blob/master/src/library/scala/collection/TraversableLike.scala#L237 – dhg
嗯。我找不到它可以找到CanBuildFrom或TraversableLike。有沒有我缺少的進口? – KChaloux