8

Tuple2 [A、B]からSeq [C]への暗黙の変換を記述したいと思います。ここで、CはAとBの両方のスーパータイプです。最初の試みは次のとおりです。

implicit def t2seq[A,B,C](t: (A,B))(implicit env: (A,B) <:< (C,C)): Seq[C] = {
    val (a,b) = env(t)
    Seq(a,b)
}

しかし、それは機能しません:

scala> (1,2): Seq[Int]
<console>:7: error: type mismatch;
 found   : (Int, Int)
 required: Seq[Int]
       (1,2): Seq[Int]
       ^

これが機能している間:

class Tuple2W[A,B](t: (A,B)) {
    def toSeq[C](implicit env: (A,B) <:< (C,C)): Seq[C] = {
        val (a,b) = env(t)
        Seq(a,b)
    }
}
implicit def t2tw[A,B](t: (A,B)): Tuple2W[A,B] = new Tuple2W(t)

使用事例:

scala> (1,2).toSeq
res0: Seq[Int] = List(1, 2)

最初の解決策が期待どおりに機能しなかった理由がわかりません。 Scalaバージョン2.8.0.r22634-b20100728020027(Java HotSpot(TM)クライアントVM、Java 1.6.0_20)。

4

1 に答える 1

9

<:<制限するパラメーターが周囲のスコープで既にバインドされている場合にのみ使用する必要があります (2 回目の試行の場合)。

implicit def t2seq[A <: C,B <: C,C](t: (A,B)) = Seq(t._1, t._2)

十分なものです。

型推論には複雑すぎるため、最初の試みはうまくいかなかったと思います。

于 2010-08-02T17:04:03.047 に答える