0

我只想反转这个集合中的项目,所以我决定要求它是它的一部分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
4

1 回答 1

6

Scala 没有use-site variance,因此+A不允许在方法中使用,只能在类中使用。无论如何,这真的没有意义。我想你不会错过的。此外,您需要在T某个地方,无论是在特征上还是在方法上。并::没有在可遍历上定义,但 aList是可遍历的,因此您可以使用一个。而且您实际上返回的是 a Traversable[T],而不是 a 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)
}
于 2012-07-27T19:29:38.083 回答