在Traversable上创建反向集合

时间:2012-07-27 19:17:32

标签: scala covariance

我想反转这个集合中的项目,所以我决定要求它成为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

1 个答案:

答案 0 :(得分:6)

Scala没有use-site variance,因此方法中不允许使用+A,只允许在类中使用T。无论如何,这里真的没有意义;我不认为你会错过它。此外,您需要在某个位置::,无论是在特征上还是在方法上。并且List没有在遍历上定义,但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) } 并没有真正为你买任何东西,因为无论如何,子类型都会让你知道。

更短更简单
{{1}}