【发布时间】:2013-05-15 12:34:56
【问题描述】:
我似乎无法理解为什么我的程序在这种情况下需要显式参数类型。使用以下方法:
trait DistTraversableLike[+T, +Repr]
extends DistTraversable[T] {
self: Repr =>
...
def scan1lD[T1 >: T, That](assOp: (T1, T1) => T1)(implicit bf: CanBuildFrom[Repr, T1, That]): That = {
val b = bf(this)
for (x <- group.prefixSumSeq(part, assOp))
b += x
b.result
}
}
我尝试在这样的特定实现中使用它:
val x:DistSeq[Int] = DistSeq((0 until worldSize): _*)
val scan = x.scan1lD(_+_)
这会产生以下错误消息:
Multiple markers at this line
- missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus{<null>}(x$2{<null>}){<null>})
{<null>}
- missing parameter type for expanded function ((x$1, x$2) => x$1.$plus{<null>}(x$2{<null>}){<null>}){<null>}
- missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus(x$2))
- missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
group 是使用 FooParOps-trait(原型实现)中的方法的混合 trait:
def prefixSumSeq[T](part: Seq[T], combiner: (T, T) => T): Seq[T] = {
implicit val srlz = getSerializerFor(part)
var result = part.head
var msg = part.reduce(combiner)
for (i <- 0 until log2i(size)) {
val partner = localRank ^ math.pow(2, i).toInt
send(partner, msg)
val number: T = rcv(partner)
msg = combiner(msg, number)
if (partner < localRank) result = combiner(number, result)
}
return (part.tail).scanLeft(result)(combiner)
}
part 来自DistTraversable[+T] 并定义为def part: Seq[T]
我不太明白为什么这里需要显式参数?请告诉我是否需要更多信息。程序现在相当复杂。
【问题讨论】:
-
scan1lD中for循环中的变量group和part是什么? -
我添加了更详尽的解释
-
我试着简化你的问题,但我最终做了很多改变,只是为了得到一些可以编译的东西......如果你更明确,你会得到同样的编译错误吗?
x.scan1lD((x:Int,y:Int) => x + y)?问题可能是因为它不知道That的类型,所以它不能隐式解析正确的CanBuildFrom? -
val scan = x.scan1lD( (a:Int,b:Int) => a+b)按预期编译和工作。对我来说,似乎应该很清楚我们需要一个类型为:CanBuildFrom[DistSeq[Int], Int, DistSeq[Int]]的构建器,因为 (+) 必须是(Int,Int) => Int -
好吧,我认为它可以接受任何定义了 + 方法并返回相同类型的参数。例如带有
def +(MyType):MyType方法的MyType。