Я пытался расширить TraversableLike моими собственными методами, но мне это не удалось.
Во-первых, посмотрите, чего я хочу достичь:
class RichList[A](steps: List[A]) {
def step(f: (A, A) => A): List[A] = {
def loop(ret: List[A], steps: List[A]): List[A] = steps match {
case _ :: Nil => ret.reverse.tail
case _ => loop(f(steps.tail.head, steps.head) :: ret, steps.tail)
}
loop(List(steps.head), steps)
}
}
implicit def listToRichList[A](l: List[A]) = new RichList(l)
val f = (n: Int) => n * (2*n - 1)
val fs = (1 to 10) map f
fs.toList step (_ - _)
Этот код отлично работает, и он вычисляет мне различиямежду элементами списка.Но я хочу иметь такой код, который работает с Seq
, Set
и т. Д., А не только с List
.
Я пробовал это:
class RichT[A, CC[X] <: TraversableLike[X, CC[X]]](steps: CC[A]) {
def step(f: (A, A) => A): CC[A] = {
def loop(ret: CC[A], steps: CC[A]): CC[A] =
if (steps.size > 1) loop(ret ++ f(steps.tail.head, steps.head), steps.tail)
else ret.tail
loop(CC(steps.head), steps)
}
}
implicit def tToRichT[A, CC[X] <: TraversableLike[X, CC[X]]](t: CC[A]) = new RichT(t)
Есть несколько ошибок,Либо неявное преобразование, ни работа ++-method
.Кроме того, я не знаю, как создать новый тип CC - см. Вызов цикла.