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
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
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
}
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
}
Bu tip paketten değil, ancak A
ve B
get
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
}
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
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