2010-08-02 13 views
8

Chcę napisać niejawna konwersja Tuple2 [A, B] SEK [C] gdzie C jest super typ A i B. Mój pierwszy spróbować, jak następuje:Problem niejawne konwersje w Scala 2,8

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) 
} 

Ale to nie działa:

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

Chociaż ten jeden działa:

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) 

przypadek użycia:

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

Nie mam pojęcia, dlaczego pierwsze rozwiązanie nie działa zgodnie z oczekiwaniami. Scala w wersji 2.8.0.r22634-b20100728020027 (Java HotSpot (TM) Client VM, Java 1.6.0_20).

+2

Myślę, że parametry "<: <" są zwykle nazywane "ev" (skrót od "evidence"), a nie env. –

Odpowiedz

9

Trzeba tylko użyć <:< jeśli parametry mają być ograniczone są już związane w otaczającym zakresie (ponieważ są one w swoim drugim razem), więc w Twoim przypadku

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

jest wystarczająca.

Przypuszczam, że twoja pierwsza próba nie zadziałała, ponieważ jest zbyt skomplikowana w przypadku wywołania typu.

Powiązane problemy