2009-02-23 29 views
7

Tôi đã tự hỏi, tôi có thể phân hủy một loại tuple thành các loại thành phần của nó trong Scala?Giải nén các loại tuple trong Scala

Ý tôi là, một cái gì đó như thế này

trait Container { 
    type Element 
} 

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

Trả lời

3

Bạn không thể giải nén, cho mỗi gia nhập, nhưng có lẽ điều này đạt được những gì bạn muốn:

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

Đó là những gì tôi nghĩ mình cần làm, nhưng muốn tránh, vì điều đó sẽ thay đổi việc triển khai các lớp mở rộng đặc điểm này. – jpalecek

+0

Ngoài ra, điều này có nghĩa là cặp phần tử sẽ là cùng một cặp ngay cả trong các lớp con? Không phải là phần tử <: (Thứ nhất, Thứ hai) [hoặc có thể bị giới hạn thấp hơn]? – jpalecek

0

Tôi hơi muộn vào đó, nhưng những gì về việc sử dụng kết hợp mẫu? Không có khá kiểu trả về chính xác, và cú pháp của tôi có thể là một chút đi, nhưng ở đây đi:

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

này không giải nén các loại, nhưng nó hạn chế các loại AB khi gọi get .

trait Container { 
    type Element 
} 

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

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

Điều này có vẻ đầy hứa hẹn, nhưng là gian lận - nó không hoạt động nếu Element là trừu tượng.

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 
} 
Các vấn đề liên quan