2015-02-09 2 views
1

Предположим, у меня есть кортежМожем ли мы создать псевдоним типа для кортежа динамически?

val myTuple: (String,Int,String,...,Boolean) = ("",0,"",..,true) 

Я могу написать псевдоним типа

type MyType = (String,Int,String,...,Boolean) 
val myTuple: MyType = ("",0,"",..,true) 

Могу ли я написать этот псевдоним типа динамически? Есть ли способ не быть явным в псевдониме этого типа и позволить компилятору найти сам тип, чтобы связать его с псевдонимом?

Для Exemple что-то вроде

case class MyCaseClass(x: String,y: Int,z:String,...,zz:Boolean) 

type MyDynamicTupleType = MyCaseClass.tupled.parameter1.type 

Не уверен, что это возможно, или, если это очень полезно, просто узнать, что с очень длинными кортежей пишущих псевдонимами очень скучный и просто шаблонный (exemple here).

Открыть для макро-основе или бесформенных решений

+1

Я не совсем уверен, что вы просите. Но для этого вы можете найти Shapeless. См. Https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#generic-representation-of-sealed-families-of-case-classes – acjay

+0

да, похоже, так. Открыто для бесформенного примера, достигающего этого тоже :) –

+0

Я не думаю, что вы можете это сделать во время исполнения (Barring Shapeless). Но все же вы можете попробовать сделать это с помощью Scala Macros. –

ответ

2

Объединяя несколько частей из бесформенных получает нас большую часть пути туда - Generic представлять наш case class как HList, Tupler представлять HList в виде кортежа:

sealed trait GenericAsTuple[G] { 
    type Out 
} 
object GenericAsTuple { 
    implicit def fromGenericAndTupler[G, T <: HList, O](
    implicit g: Generic[G]{type Repr = T}, t: Tupler[T] {type Out = O}) = 
     new GenericAsTuple[G]{type Out = O} 
    def apply[G](implicit g: GenericAsTuple[G]): GenericAsTuple[G]{ 
    type Out = g.Out} = g 
} 

val myGat = GenericAsTuple[MyCaseClass] 
type MyDynamicTupleType = myGat.Out 

Я не знаю способа (сокр макросов), чтобы избежать два шага для вызова - myGat должно быть стабильное значение, чтобы иметь возможность объявить тип псевдонима, мы не можем просто сделать GenericAsTuple[MyCaseClass].Out,

+0

спасибо, попробуем это –

Смежные вопросы