2015-08-26 22 views
0

我需要定義一個類型爲Action[T >: MyType]的列表,其中MyType現在相當於Any,但它可能會更改。如何使用無形的HList有一個相同類型的列表,但具有不同的通用?

A List[Action[T]]不適合很多情況,編譯器無法解決它。

所以我想我可以使用HList但我真的很喜歡它。

我開始與type ListOfAction = HList,但我希望我的列表中的元素是所有Action,但我不知道如何指定名單應該像Action[Double]Action[Int]Action[String],...而不是唯一可能的類型。

+0

這是什麼意思*定義一個類型爲「Action [T:> MyType]」*的列表?你將如何使用類型中較低的類型綁定? –

+0

類似於'type Action [T:> MyType] =(T)=> T' – Chobeat

+0

它編譯但我想要一個只包含Action元素的'HList',但我不知道該怎麼做 – Chobeat

回答

2

您將無法將其編碼爲類型。但是使用無形的你可以寫一個只接受你提到的HList類型的函數。

既然你沒有提供你的行動的定義,我會用這一個:

case class Action[+T <: MyType](value: T) 

而對於一些MyType的居民,我們會使用這樣的:

trait MyType 
case class MyString(string: String) extends MyType 
case class MyInt(int: Int) extends MyType 

現在使用LUBConstraint fromlessless我們現在可以限制HList的所有元素都具有相同的超類型:

def accept[L <: HList](hlist: L) 
         (implicit ev: LUBConstraint[L, Action[MyType]]) = println(hlist) 

現在,你可以試試這個:

accept(Action(MyString("string")) :: Action(MyInt(1)) :: HNil) 

這枚:

accept(Action(MyString("string")) :: 1 :: HNil) 

將無法​​編譯。

請注意,您需要定義在行動T+T,改變了:><:,否則你不會得到亞型關係。

相關問題