Скала скрытого отменить

Я пытаюсь неявно деконструировать экземпляр класса в кортеж, чтобы создать лучший синтаксис DSL.

Вот упрощенный пример того, что я пытаюсь сделать:

class Pair[A,B](a: A, b: B){
  def left = a
  def right = b
}
val pair = new Pair(1,2)
implicit def unpair[T1 <: Int, T2 <: Int](p: Pair[T1,T2]) = {
  (p.left, p.right)
}
val(a,b) = pair

результаты в:

error: constructor cannot be instantiated to expected type;
 found   : (T1, T2)
 required: Pair[Int,Int]

Я знаю, что могу определить сопутствующий объект с помощью неприменимого метода и вручную обработать деконструкцию (или явно вызвать выше неявно), но это создает нежелательный шаблон.

Edit Ok, просто чтобы предоставить немного больше контекста, Pair встроен в экземпляр, который реализует map, flatMap и withFilter (т. е. для использования внутри для понимания). Итак, желаемое использование выглядит примерно так:

val q = for{
  (a,b) <- tableA join tableB on(...)
  (c,d) <- tableC leftJoin tableD on(...)
  ....
} yield(a,b,c,d,...)

Чего я хотел бы избежать, так это сделать Pair классом case (или добавить собственный объект-компаньон в существующий класс Pair) и Pair(a,b) <- tableA join tableB on(...) каждый раз, когда я присоединяюсь к таблицам (читай: часто)

оригинал

Есть ли способ осуществить это в Scala 2.10 или 2.11? Существуют более старые потоки SO с 2.8/2.9 днями, которые указывают, что эта функциональность невозможна, но я надеюсь, что с тех пор что-то изменилось или что есть обходной путь.

2 ответа

Вам необходимо установить тип a и b в явном виде:

 val(a,b): (Int, Int) = pair

Если вы просто хотите извлечь левый и правый (я думаю, из вашего примера), почему бы не решить вашу проблему с еще меньшим количеством кода:

case class Pair[A, B](left: A, right: B)

val pair = Pair(1, 2)

val Pair(a, b) = pair

println(a, b)
Другие вопросы по тегам