1
我似乎無法理解爲什麼我的程序需要這種情況下的顯式參數類型。使用下面的方法:缺少泛型掃描的參數類型
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))
組是混合的特質使用來自FooParOps-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'是什麼? –
我加了一個更全面的解釋 – Felix
我試着簡化了你的問題,但最後我做了很多改變,只是爲了得到編譯好的東西......如果你更明確的話,你會得到相同的編譯錯誤, 'x.scan1lD((x:Int,y:Int)=> x + y)'?一個問題是,它不能隱式地解決正確的'CanBuildFrom',因爲它不知道'That'的類型? –