Scala

2009-02-23 14 views
7

için tuple türlerinin paketlerinden çıkarılması Merak ettim, bir tuple tipini Scala'daki bileşenlerinin tiplerine ayırabilir miyim? ,Scala

type First 
    type Second 
    type Element = (First, Second) 
    def get(x: First): Second 

cevap

3

böyle bir şey, kendi başına, ama belki bu istediğini başarır ancak desen eşleştirmeyi kullanma konusunda ne düşünüyorsunuz? Oldukça doğru dönüş türü yok mu ve benim sözdizimi burada biraz uzakta olabilir ama gider:

def get[K](key: K): Iterable[Any] { 
    for ((key, x) <- elements) yield x 
} 
+0

Yapmam gerektiğini düşündüğüm şeydi, ancak kaçınmak istedim, çünkü bu özellik bu sınıfın genişletilmesiyle ilgili sınıfların uygulanmasını değiştirebilirdi. – jpalecek

+0

Ayrıca, bu, Element çiftinin alt sınıflarda bile aynı Pair olacağı anlamına mı geliyor? Daha ziyade Element <: (İlk, İkinci) [ya da belki de alt sınırlanmış] olmalı mı? – jpalecek

0

Bunun için biraz geciktim:

Yani, sen paketten olamaz

trait Container { 
    type Element 
} 

trait AssociativeContainer extends Container { 
    type Element <: (Unit, Unit) 
    def get(x : Element#First) : Element#Second 
} 
3

Bu tip paketten değil, ancak A ve Bget arayarak türlerini sınırlamak yok . Element soyut ise çalışmıyor -

trait Container { 
    type Element 
} 

trait AssociativeContainer extends Container { 
    type Element <: Tuple2[_, _] 

    def get[A, B](x: A)(implicit ev: (A, B) =:= Element): B 
} 

Bu umut verici görünüyor, ama hile.

def Unpack[T<:Tuple2[_, _]] = new { 
    def apply[A, B](implicit ev: T <:< (A, B)) = new { 
    type AA = A 
    type BB = B 
    } 
} 

trait AssociativeContainer { 
    type Element = (Int, String) 
    val unpacked = Unpack[Element].apply 
    type A = unpacked.AA 
    type B = unpacked.BB 

    1: A 
    "": B 
    def get(x: A): B 
}