2017-04-15 53 views
0

我想將矢量序列作爲矩陣處理。顯然我們有兩個需要區分的案例。它是一個行向量序列還是它是一個列向量序列。但是矢量本身可以是任何分數類型的。所以,我已經試過這樣:如何正確使用TypeTag如果要匹配的類型也需要類型參數

implicit class MatrixEvent[K: Ordering, V: Fractional, T <: VectorEvent[K, V]](x: Seq[T])(implicit tag: TypeTag[T]) { 
    lazy val mx = tag.tpe match { 
     case t if t =:= typeOf[ColumnVectorEvent[K, V]] => 
     x.zipWithIndex.foldLeft(new Array2DRowRealMatrix(x(0).vector.getRowDimension, x.length))({case (mx, (vec, idx)) => { 
      mx.setColumnVector(idx, vec.vector.getColumnVector(0)) 
      mx 
     }}) 
     case t if t =:= typeOf[RowVectorEvent[K, V]] => 
     x.zipWithIndex.foldLeft(new Array2DRowRealMatrix(x.length, x(0).vector.getColumnDimension))({case (mx, (vec, idx)) => { 
      mx.setRowVector(idx, vec.vector.getRowVector(0)) 
      mx 
     }}) 
    } 
    } 

但Scala編譯器不喜歡這種很:

Error:(52, 29) No TypeTag available for ColumnVectorEvent[K,V] 
     case t if t =:= typeOf[ColumnVectorEvent[K, V]] => 
+0

您只在外部類型上匹配嗎?那麼你可以使用'ClassTag'。 – Kolmar

回答

2

我看到你正在嘗試做的,但爲什麼你會懶得使用運行邏輯和匹配在這種類型的時候,你可以選擇implicits?除非我錯過了一些東西。

讓我們假設你的ADT看起來是這樣的:

trait VectorEvent[K, V] 
trait ColumnVectorEvent[K, V] extends VectorEvent[K, V] 
trait RowEvent[K, V] extends VectorEvent[K, V] 
trait Compute[T <: VectorEvent[K, V], K, V] { 
    def compute(ev: T): Array2DRowRealMatrix 
} 

object Compute { 
    implicit def rowEventCmp[K, V]: Compute[RowEvent[K, V], K, V]] = { 
    new Compute { 
    def compute: Array2DRowRealMatrix = { 
     x.zipWithIndex.foldLeft(new Array2DRowRealMatrix(x(0).vector.getRowDimension, x.length))({case (mx, (vec, idx)) => { 
     mx.setColumnVector(idx, vec.vector.getColumnVector(0)) 
     mx 
    }}) 
    } 
    } 
    } 
    implict def columnVectorEvent[K, V] = ... 
} 

然後終於,你可以利用類型類的實例。 Scala將知道如何查找默認伴侶對象Compute以搜索這些含義。

implicit class MatrixEvent[ 
    K: Ordering, 
    V: Fractional, 
    T <: VectorEvent[K, V] 
](x: Seq[T])(implicit ev: Compute[T, K, V]) { 
    lazy val mx = ev.compute 
    } 
相關問題