下面的特征在没有@specialized
注释或没有map
方法的情况下编译得很好。否则,它会因编译错误而失败,这没有多大意义(至少对我而言):
[error] (compile:compile) scala.tools.nsc.symtab.Types$TypeError: type mismatch;
[error] found : U(in method foreach)(in method foreach)
[error] required: U(in method foreach)(in method foreach)
这是我所说的特质:
trait Tuple2Traversable[@specialized(Int, Byte) +A, @specialized(Int, Byte) +B] {
def foreach[T](fn: (A, B) => T)
def map[T](fn: (A, B) => T): Traversable[T] = new Traversable[T] {
def foreach[U](f: T => U) {
def composed(a: A, b: B) = f(fn(a, b))
Tuple2Traversable.this.foreach(composed)
}
}
def flatMap[T](fn: (A, B) => Traversable[T]): Traversable[T] = new Traversable[T] {
def foreach[U](f: (T) => U) {
def composed(a: A, b: B) = fn(a, b).foreach(f)
Tuple2Traversable.this.foreach(composed)
}
}
def filter(included: (A, B) => Boolean): Tuple2Traversable[A, B] = new Tuple2Traversable[A, B] {
def foreach[T](fn: (A, B) => T) {
def composed(a: A, b: B) = if (included(a, b)) fn(a, b)
Tuple2Traversable.this.foreach(composed)
}
}
def foldLeft[T](z: T)(fn: (T, A, B) => T): T = {
var current = z
def op(a: A, b: B) {
current = fn(current, a, b)
}
foreach(op)
current
}
def asTraversable = new Traversable[(A, B)] {
def foreach[U](f: ((A, B)) => U) {
def tupled(a: A, b: B) = f((a, b))
Tuple2Traversable.this.foreach(tupled)
}
}
}
我一直在盯着这一段时间。任何有关如何解决这个问题的建议都将受到高度赞赏。
也许我应该补充一点,这个类的目的是拥有一个Traversable的元组,而不必强制创建那些元组。 Traversable[(A,B)]
会接受Tuple2[A,B] => T
作为foreach
的参数。我希望我的'traversable'接受函数(A, B) => T
。 (比如def fn(a: Int, b: Int) = a + b
。)
答案 0 :(得分:2)
看起来像是一些内部编译器错误。我在scala 2.9.2中得到了相同的错误,但它在scala 2.10-RC2
中编译得很好