我们可以动态地为元组创建类型别名吗?

Can we create a type alias for a tuple dynamically?

假设我有一个元组

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

我可以写一个类型别名

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

我可以动态地写这个类型别名吗?有没有办法在这种类型别名中不显式并让编译器找到类型本身以关联到别名?

例如

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

type MyDynamicTupleType = MyCaseClass.tupled.parameter1.type

不确定这是否可行或者这是否非常有用,只是发现对于非常长的元组编写别名非常无聊并且只是样板文件 ()。

对基于宏或无形的解决方案开放

将 shapeless 中的几个片段组合在一起让我们完成了大部分工作 - Generic 将我们的 case class 表示为 HListTupler 表示 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.