我的代码使用Scala和Breeze线性代数库。我有类型的对象
DenseVector[Double]
,
DenseVector[Int]
等哪里
DenseVector
是一个类似数组的容器,具有用于数值计算的专用方法。我有时需要对包含的类型使用模式匹配。类型擦除迫使我引入一个trait和“包装”case类:
sealed trait DenseVectorRoot
case class DenseVectorReal(val data: DenseVector[Real]) extends DenseVectorRoot
case class DenseVectorMatrixReal(val data: DenseVector[DenseMatrix[Real]]) extends DenseVectorRoot
(其中
Real
只是的别名
Double
).
模式匹配如下所示:
def print(data: DenseVectorRoot) =
data match {
case DenseVectorMatrixReal(_) => println("Contains real matrices")
case DenseVectorReal(_) => println("Contains real scalars")
}
我想摆脱
DenseVectorRoot
特质我尝试了以下操作:
def print2(data: DenseVector[_ <: Any]) =
data match {
case _: DenseVector[Double] => println("Contains real matrices")
case _: DenseVector[Int] => println("Contains real scalars")
}
但是类型参数会被删除。
我应该如何修改
print2
使用类标记以便模式匹配工作?例如,通过在以下代码中打印正确的输出:
val v0 = DenseVector(1.2, 1.5, 1.6)
val v1 = DenseVector(3, 4, 5)
val a = Array(v0, v1)
a.map(print2)
编辑
我需要管理
Array
对于不同的容器,我的代码需要管理不同类型的数据(例如,对于
DenseVector[Real]
对于
DenseVector[Matrix[Real]]
). 我目前的设计是将所有东西存储在
Array[DenseVectorRoot]
,然后使用高阶函数处理数据,如
.map()
. 每个函数都将在元素到元素的基础上进行模式匹配,以了解数据是否为
DenseVectorReal
或a
DenseVectorMatrixReal
,并据此采取行动。
这可能不是解决我的问题的最佳设计,但我不知道在编译时用户提供了什么类型的数据。我很高兴知道任何更好的设计!