2015-02-09 83 views
1

假設我有一個元組我們可以動態地爲元組創建一個類型別名嗎?

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 

不知道這是可能的,或者這是非常有用的,只是找出很長的元組寫別名是很無聊的,是剛剛樣板(exemple here)。

開放的宏觀基礎或無形的解決方案

+1

我不完全確定你在問什麼。但是你可能會發現無形對此有用。看到https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#generic-representation-of-sealed-families-of-case-classes – acjay 2015-02-09 11:39:44

+0

是的,它似乎是這樣的。打開一個無形的例子實現這一點:) – 2015-02-09 13:38:53

+0

我不認爲你可以在運行時(無形狀)。但你仍然可以嘗試用Scala Macros來做這件事。 – 2015-02-09 14:21:17

回答

2

結合一對夫婦從無形件得到我們大多數的方式出現 - Generic代表我們case classHListTupler代表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

謝謝你會嘗試 – 2015-02-09 14:57:38

相關問題