Создание обратной коллекции на Traversable

Я хочу просто поменять местами элементы в этой коллекции, поэтому я решил потребовать, чтобы она была частью Traversable и любого из ее подтипов, и чтобы она возвращала Traversable, но я думаю, что мне может понадобиться использовать дисперсию для этого также, но на данный момент я получаю ошибку компилятора, используя Scala 2.10.0-M5.

trait Polynomials {
    def coefficients[+A <: Traversable[T]](x:A):Traversable[A] =  x.foldLeft(Traversable[A]())((b,a) => a :: b)

}

Это ошибки, которые я получаю, и я не уверен, что я сделал неправильно.

Description Resource    Path    Location    Type
']' expected but identifier found.  Polynomials.scala   line 4  Scala Problem
'=' expected but ']' found. Polynomials.scala   line 4  Scala Problem
illegal start of simple expression  Polynomials.scala   line 5  Scala Problem

person James Black    schedule 27.07.2012    source источник
comment
Это весь код в Polynomials.scala или вы опускаете какой-то код для краткости?   -  person Emil H    schedule 27.07.2012
comment
Вам нужен самодостаточный пример. Тип T нигде не определен. Кроме того, вы не можете аннотировать параметр типа метода с помощью дисперсии, поэтому +A не имеет никакого смысла. Тип в аргументе метода всегда находится в контравариантной позиции (вы можете вызывать def m(a: AnyRef) с аргументом String, а возвращаемый тип всегда находится в ковариантной позиции (вы можете рассматривать результат def m() : String как AnyRef.   -  person 0__    schedule 27.07.2012
comment
@EmilH - На самом деле, на данный момент это только одна функция. Я буду добавлять больше, но я застрял.   -  person James Black    schedule 28.07.2012


Ответы (1)


В Scala нет вариантности использования сайта, поэтому +A не допускается в методе, только в классе. В любом случае это не имеет смысла; Я не думаю, что вы пропустите это. Кроме того, вам нужно где-то T, либо в трейте, либо в методе. И :: не определен для traversable, но List является traversable, так что вы можете его использовать. И на самом деле вы возвращаете Traversable[T], а не Traversable[A]. Так:

trait Polynomials {
  def coefficients[T, A <: Traversable[T]](x: A): Traversable[T] = 
    x.foldLeft(List[T]())((b,a) => a :: b)
}

Но A <: Traversable[T] на самом деле ничего вам не покупает, поскольку подтипирование все равно дает вам это. Так короче и проще

trait Polynomials {
  def coefficients[T](x: Traversable[T]): Traversable[T] = 
    x.foldLeft(List[T]())((b,a) => a :: b)
}
person Rex Kerr    schedule 27.07.2012