2016-11-04 17 views
0

我有一個容器類如何將(不同的)泛型傳遞給varags?

object OptimisationVariable { 

    implicit class OptimisationVariableSeq[B](seq: Seq[OptimisationVariable[B]]) { 
    def extract[A: ClassTag](variable: (OptimisationVariable[B] => A)): DenseVector[A] = 
     DenseVector(seq.map(variable).toArray) 
    } 

} 

final case class OptimisationVariable[B: ClassTag](startposition: B,  
                startlearningrate: Double) 

,我想傳遞給我的算法:

​​

,但我得到OptimisationVariable需要一個類型參數的誤差。這就說得通了。但是我想通過能夠傳遞不同類型的參數。由於optimisationVariable將是一個Seq,我不知道我應該如何去做這件事。 B將會是IntDouble。例如。

new MyAlgorithm(OptimisationVariable(1, 2.0), OptimisationVariable(3.0, 4.0)) 

後來我想決定做什麼,這取決於它的一個IntDouble

+0

不可能的可變參數。你可以看看無形 – cchantep

+0

@cchantep:我認爲這可能是有可能的視圖邊界或類似的東西(雖然它們似乎被棄用)。 – Make42

+0

@cchantep:你知道如何在這種情況下做成形嗎? – Make42

回答

1

如果您不打算限制B所有,使用存在的類型是OK:

final case class OptimisationVariable[B: ClassTag](
    startposition: B, 
    startlearningrate: Double 
) 
case class MyAlgorithm(optimisationVariable: OptimisationVariable[_]*) 
// and then 
MyAlgorithm(OptimisationVariable(1, 1.0), OptimisationVariable(2, 1.1)) 

如果你打算通過一些上限來限制他們,在某些類型類扔,你都還是不錯的。

如果你是啓發,嘗試不成形,由上述意見的建議,這裏是一個很好的起點書(彆着急這是短期和實用!):shapeless-guide

0

我簡化你的榜樣了一下,所以我理解,基本上你想要這個:

case class Ov[A](start: A, degree: Double) 
case class MyAlg[L <: HList : *->*[Ov]#λ](ov: L) 

MyAlg(Ov(1, 2):: Ov("Hello", 2) :: HNil) //compiles 
MyAlg(1 :: HNil)  // won't compile 

現在你可以通過任何數量的OptimizedVariables,保持它們的類型。 然後,如果您需要映射它,則只需爲要使用的類型定義多態函數(來自無形)。

其實,如果他們只是IntDouble,你可以做

case class Ov1(start: Int \/ Double, degree: Double) // \/ from scalaZ 
case class MyAlg1(ov: List[Ov1]) 

甚至使用聯合類型從不成形(|v|),而不是\/

相關問題