2

暗黙の順序付けを使用したscalaコレクションメソッドでenrich-my-libraryパターンを利用しようとしています。

この定義を考えると:

object ImplicitTest {
  implicit def RichTraversableOnce[A](t: TraversableOnce[A]): RichTraversableOnce[A] =
    new RichTraversableOnce[A](t)

  class RichTraversableOnce[A](val t: TraversableOnce[A]) {
    def myMinBy[B >: A](f: A => B)(implicit cmp: Ordering[B]): A = {
      if (t.isEmpty)
        throw new UnsupportedOperationException("empty.myMinBy")

      t.reduceLeft((x, y) => if (cmp.lteq(f(x), f(y))) x else y)
    }
  }
}

このテストはどうしてですか?

 @Test
  def testOrdering {
    import ImplicitTest._
    val mx = List(1, 2, 7, 1, 4, 8, 2, 5, 47, 2, 7).myMinBy(_.toDouble)

    // ...but this works:
    // val mx = List(1, 2, 7, 1, 4, 8, 2, 5, 47, 2, 7).minBy(_.toDouble)

    println(mx)
  }

このコンパイルエラーが発生しますか?

エラー:AnyVal {def getClass():java.lang.Class [_>:Int with Double <:AnyVal]}に対して暗黙の順序が定義されていません。val mx = List(1、2、7、1、4、8、2、5、47、2、7).myMinBy(_。toDouble)

4

1 に答える 1

4

B >: Aあなたの理由はありませんmyMinBy。これが、とAnyValの最小上限です。あなたのコードはIntDoublemyMinBy[B](...)

于 2011-11-23T12:03:23.317 に答える