Распаковка типов кортежей в Scala - PullRequest
7 голосов
/ 23 февраля 2009

Мне было просто интересно, могу ли я разложить тип кортежа на типы его компонентов в Scala?

Я имею в виду, что-то вроде этого

trait Container {
  type Element
}

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

Ответы [ 3 ]

3 голосов
/ 16 мая 2010

Это не распаковывает типы, но ограничивает типы A и B при вызове get.

trait Container {
  type Element
}

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

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

Это выглядит многообещающе, но обманывает - не работает, если Element абстрактно.

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
}
3 голосов
/ 23 февраля 2009

Вы не можете распаковать, по сути, но, возможно, это достигнет того, что вы хотите:

  type First
  type Second
  type Element = (First, Second)
  def get(x: First): Second
0 голосов
/ 16 мая 2010

Я немного опоздал, но как насчет использования сопоставления с образцом? Не совсем правильный тип возвращаемого значения, и мой синтаксис может быть немного неправильным, но здесь идет:

def get[K](key: K): Iterable[Any] {
  for ((key, x) <- elements) yield x
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...