3

好的,所以我有这个:

implicit final class RichIterableLike[A, Repr <: IterableLike[A, Repr]](val it: Repr) 
  extends AnyVal {
  def pairDiff[To](implicit num: Numeric[A], cbf: CanBuildFrom[Repr, A, To]): To = {
    val b     = cbf(it)
    val iter  = it.iterator
    if (iter.hasNext) {
      var pred = iter.next()
      while (iter.hasNext) {
        import num.mkNumericOps
        val succ = iter.next()
        b += succ - pred
        pred = succ
      }
    }
    b.result()
  }
}

这会编译,但不会启动:

val stabs = IndexedSeq(1.0, 2.0, 3.0)
stabs.pairDiff

给出:value pairDiff is not a member of IndexedSeq[Double]

显式转换工作:

new RichIterableLike[Double, IndexedSeq[Double]](stabs).pairDiff

...如何解决这个问题?


编辑

如果我应用这个答案的方法,它会起作用:

implicit final class RichIterableLike[A, CC[~] <: Iterable[~]](val it: CC[A]) 
  extends AnyVal {
  def pairDiff[To](implicit num: Numeric[A], cbf: CanBuildFrom[CC[A], A, To]): To = {
  ...
}

但是问题仍然存在,在后一种情况下使隐式查找发挥作用的关键区别是什么。

4

1 回答 1

1

为了使隐式查找起作用,它需要AReprIterableLike需要该链接)之间的链接。您将其作为参数传入,因此该参数应键入为Repr[A]. 这意味着您需要修改您的签名,使其看起来像这样:

RichIterableLike[A, Repr[X] <: IterableLike[X, Repr[X]]](val it: Repr[A])

有了上面的签名,你说:

我有一个接受类型参数的对象,我将命名该对象Repr,当你将它传入时,我也想捕获类型参数。我将命名该类型参数A。作为一个额外的条件,我希望类型Repr符合IterableLike

于 2013-03-13T23:22:12.540 回答