わかりましたので、私はこれを持っています:
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 = {
...
}
しかし、疑問が残ります。後者の場合に暗黙的なルックアップを開始させる決定的な違いは何ですか。