【发布时间】:2013-12-18 05:40:34
【问题描述】:
我正在尝试实现一个隐式函数mapMetered,它包装了map,并且在返回正确类型方面与它完全一样。我试过这个:
implicit class MeteredGenTraversablePimp[T, C[T] <: GenTraversable[T]](trav: C[T]) {
def foreachMetered(m: Meter)(f: T => Unit) =
m.foreach(trav)(f)
def mapMetered[B, That](m: Meter)(f: (T) => B)(
implicit bf: CanBuildFrom[C[T], B, That]
): That = {
m.start()
try {
trav.map { x =>
val z = f(x)
m.item_processed()
z
} (bf)
} finally { m.finish() }
}
}
但是当我尝试这个时,我得到一个错误:
[info] Compiling 1 Scala source to /Users/benwing/devel/textgrounder/target/classes...
[error] /Users/benwing/devel/textgrounder/src/main/scala/opennlp/textgrounder/util/metering.scala:223: type mismatch;
[error] found : scala.collection.generic.CanBuildFrom[C[T],B,That]
[error] required: scala.collection.generic.CanBuildFrom[scala.collection.GenTraversable[T],B,That]
[error] } (bf)
[error] ^
[error] one error found
有类似的 Stack Overflow 问题,包括 Daniel Sobral 提出的一个问题,他建议写 (trav: C[T] with GenTraversableLike[T]),但这并不能解决问题。
【问题讨论】:
-
你做的和
scala.collection.breakOut的功能类似吗(描述here)? -
@DaoWen:不,我只是想创建一个行为类似于
map并返回正确类型的隐式函数。就我而言,这是map的计量版本,它计算完成整个操作所需的时间、每次迭代的执行速度等。