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

暗黙的なルックアップが機能するためには、との間のリンクが必要AですReprIterableLikeそのリンクを要求します)。これを引数として渡すので、引数は。として入力する必要がありますRepr[A]。つまり、署名を次のように変更する必要があります。

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

上記の署名であなたは言います:

タイプパラメータを受け入れるオブジェクトがあります。そのオブジェクトに名前を付けます。オブジェクトReprを渡すときに、タイプパラメータもキャプチャします。そのタイプパラメータに名前を付けますARepr追加の条件として、タイプをの署名に準拠させたいIterableLike

于 2013-03-13T23:22:12.540 に答える