【发布时间】:2011-02-12 14:19:38
【问题描述】:
我正在 scala 中实现一些轻量级的数学向量。我想在编译时使用类型系统来检查向量的兼容性。例如,尝试将一个维数为 2 的向量与另一个维数为 3 的向量相加会导致编译错误。
到目前为止,我将维度定义为案例类:
sealed trait Dim
case class One() extends Dim
case class Two() extends Dim
case class Three() extends Dim
case class Four() extends Dim
case class Five() extends Dim
这里是向量定义:
class Vec[D <: Dim](val values: Vector[Double]) {
def apply(i: Int) = values(i)
def *(k: Double) = new Vec[D]( values.map(_*k) )
def +(that: Vec[D]) = {
val newValues = ( values zip that.values ) map {
pair => pair._1 + pair._2
}
new Vec[D](newValues)
}
override lazy val toString = "Vec(" + values.mkString(", ") + ")"
}
这个解决方案效果很好,但是我有两个问题:
如何添加一个返回维度的
dimension():Int方法(即Vec[Three]为3)?如何在不提前声明所有需要的案例类的情况下处理更高的维度?
PS:我知道有很好的现有数学向量库,我只是想提高我对 scala 的理解。
【问题讨论】: